HDU【3790】最短路径问题

来源:互联网 发布:电脑解压软件zip 编辑:程序博客网 时间:2024/05/29 09:27
给你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

解题思路:比最裸最短路多一个花费的要求

直接迪杰斯特拉

code:

#include <stdio.h>#include <string.h>#define inf 9999999#define N 1005int map[N][N][2],dis[N],vt[N],jg[N];int n;int s,e;void dijkstra(){    int i,j,k,min;    for(k=1;k<=n-1;k++)    {        j=s;        min=inf;        for(i=1;i<=n;i++)        {
//这里只对路径进行判断,因为从起点到s点的距离和到s2点的距离相等
//但s1和s2没有花费比较的意义,因为到达s1和s2不是同一个点
            if(!vt[i]&&dis[i]<min)            {                j=i;                min=dis[i];            }        }        vt[j]=1;        for(i=1;i<=n;i++)        {            if(!vt[i]&&dis[i]>dis[j]+map[i][j][0])            {                dis[i]=map[i][j][0]+dis[j];                jg[i]=jg[j]+map[i][j][1];            }            if(!vt[i]&&dis[i]==dis[j]+map[i][j][0])            {                if(jg[i]>jg[j]+map[i][j][1])                {                    dis[i]=map[i][j][0]+dis[j];                    jg[i]=jg[j]+map[i][j][1];                }            }        }    }    printf("%d %d\n",dis[e],jg[e]);}int main(){    int m,i,j,x,y,z,h;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0 && m==0)        break;        memset(vt,0,sizeof(vt));        for(i=0;i<N;i++)        for(j=0;j<N;j++)        {            if(i==j)            {            map[i][j][0]=0;            map[i][j][1]=0;            }            else            {            map[i][j][0]=inf;            map[i][j][1]=inf;            }        }        for(i=0;i<m;i++)        {            scanf("%d %d %d %d",&x,&y,&z,&h);            if(map[x][y][0]>z)            {                map[x][y][0]=map[y][x][0]=z;                map[x][y][1]=map[y][x][1]=h;            }        }        scanf("%d %d",&s,&e);        for(i=1;i<=n;i++)        {            dis[i]=map[i][s][0];            jg[i]=map[i][s][1];        }        vt[s]=1;        dijkstra();    }    return 0;}</span></span></span>


0 0