HDU 3790 最短路径问题

来源:互联网 发布:网络女生翻唱歌手 编辑:程序博客网 时间:2024/06/18 16:58
最短路径问题
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status Practice HDU 3790

Description

给你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 0
 

Sample Output

9 11
 




#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAX 9999999int map[1100][1100],p[10000];int pp[1100][1100];int num[10000],num1[10000];int n,m,i,j;int y1,y2,k;int qq;void dijkstra(){    int s = y1,min;    memset(num,MAX,sizeof(num));    memset(num1,0,sizeof(num1));    for(i=1;i<=n;i++)    {        num[i] = map[s][i];        num1[i] = pp[s][i];    }    qq = num1[y2];    p[s] = 1;    for(i=1;i<=n;i++)    {        min = MAX;        for(j=1;j<=n;j++)        {            if(p[j] == 0 && num[j]<min)            {                min = num[j];                k = j;            }        }        if(min == MAX)        {            break;        }        p[k] = 1;        for(j=1;j<=n;j++)        {            if(p[j] == 0 && num[j]> num[k] + map[j][k])            {                num[j] = num[k] + map[j][k];                num1[j] = num1[k] + pp[j][k];            }            if(p[j]==0&&num[j]==num[k]+map[j][k])                    if(num1[j] > num1[k] + pp[j][k])                        num1[j] = num1[k] + pp[j][k];        }    }    printf("%d %d\n",num[y2],num1[y2]);}int main(){    int a1,a2,x1,x2;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n == 0 && m == 0)        {            break;        }        qq = MAX;        memset(p,0,sizeof(p));        for(i=0;i<=n;i++)        {            for(j=0;j<=n;j++)            {                map[i][j] = MAX;                pp[i][j] = MAX;            }            if(i == j)            {                map[i][j] = 0;                pp[i][j] = 0;            }        }        for(i=0;i<m;i++)        {            scanf("%d%d%d%d",&a1,&a2,&x1,&x2);            if(map[a1][a2]>x1)            {                  map[a1][a2] = x1;                    map[a2][a1] = x1;                    pp[a1][a2] = x2;                    pp[a2][a1] = x2;            }        }        scanf("%d%d",&y1,&y2);        dijkstra();    }    return 0;}


0 0
原创粉丝点击