1. 程式人生 > >hdu3790:最短路徑問題

hdu3790:最短路徑問題

Problem 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 2

1 2 5 6

2 3 4 5

1 3

0 0

 

Sample Output

 

9 11

 

這道題可以用求最短路的方法來求,但是兩個地方的路可能有多條,所以應該先找出兩個地方距離最短,距離相同時再找出花費最少的。

#include<stdio.h>
#include<string.h>
#define N 1020
int e[N][N],cos[N][N],book[N],dis[N],cs[N];
int main()
{
    int a,b,d,p,i,j,k,n,m,s,t,min,u,v;
    int intf=99999999;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        if(m==0&&n==0)
            break;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(i==j)
                    e[i][j]=cos[i][j]=0;
                else
                    e[i][j]=e[j][i]=cos[i][j]=cos[j][i]=intf;
        
        
        for(i=0;i<m;i++)
        {
            scanf("%d %d %d %d",&a,&b,&d,&p);
            if(d<e[a][b])
            {
            	e[a][b]=e[b][a]=d;
            	cos[a][b]=cos[b][a]=p;
			}
            if(d==e[a][b])
            	cos[a][b]=cos[b][a]=p;
        }
        scanf("%d %d",&s,&t);
        for(i=1;i<=n;i++)
        	book[i]=0;
		book[s]=1;
        for(i=1;i<=n;i++)
        {
            dis[i]=e[s][i];
            cs[i]=cos[s][i];
        }
                
        for(i=1;i<=n-1;i++)
        {
            min=intf;
            for(j=1;j<=n;j++)
            {
                if(book[j]==0&&dis[j]<min)
                {
                    min=dis[j];
                    u=j;
                }
            }
            book[u]=1;
            for(v=1;v<=n;v++)
            {
                if(e[u][v]<intf)
                {
                    if(dis[v]>dis[u]+e[u][v])
                    {
                        dis[v]=dis[u]+e[u][v];
                        cs[v]=cs[u]+cos[u][v];            
                    }
                    if(dis[v]==dis[u]+e[u][v]&&cs[v]>cs[u]+cos[u][v])
                     	cs[v]=cs[u]+cos[u][v];
                }
            }
        }
        printf("%d %d\n",dis[t],cs[t]);
    }
    return 0;
}