首页 > 学院 > 开发设计 > 正文

hdu 3790

2019-11-06 07:57:07
字体:
来源:转载
供稿:网友
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。Input输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。 (1<n<=1000, 0<m<100000, s != t)Output输出 一行有两个数, 最短距离及其花费。Sample Input
3 21 2 5 62 3 4 51 30 0Sample Output
9 11
#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int dis[100003][2];int maps[1003][1003][2];int x,y;int n,m;int vis[100003];void dijkstra(){    memset(vis,0,sizeof(vis));    for(int i=1; i<=n; i++)    {        dis[i][0]=maps[x][i][0];        dis[i][1]=maps[x][i][1];    }    vis[x]=1;    for(int i=1; i<n; i++)    {        int p;        int m_min=0x1f1f1f1f;        for(int j=1; j<=n; j++)        {            if(m_min>dis[j][0]&&!vis[j])            {                m_min=dis[j][0];                p=j;            }        }        vis[p]=1;        for(int j=1; j<=n; j++)        {            if(dis[j][0]>dis[p][0]+maps[p][j][0])            {                dis[j][0]=dis[p][0]+maps[p][j][0];                dis[j][1]=dis[p][1]+maps[p][j][1];            }            if(dis[j][0]==dis[p][0]+maps[p][j][0])            {                dis[j][1]=min(dis[j][1],dis[p][1]+maps[p][j][1]);            }        }    }}int main(){    while(scanf("%d%d",&n,&m)==2&&(n||m))    {        for(int i=1; i<=n; i++)        {            for(int j=1; j<=n; j++)            {                if(i==j)                    maps[i][j][0]=0,maps[i][j][0]=0;                else maps[i][j][1]=maps[i][j][0]=0x1f1f1f;            }        }        for(int i=0; i<m; i++)        {            int a,b,c,d;            scanf("%d%d%d%d",&a,&b,&c,&d);            if(maps[a][b][0]>c||(maps[a][b][0]==c&&maps[a][b][1]>d))            {                maps[a][b][0]=maps[b][a][0]=c;                maps[a][b][1]=maps[b][a][1]=d;            }        }        scanf("%d%d",&x,&y);        dijkstra();        PRintf("%d %d/n",dis[y][0],dis[y][1]);    }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表