hdu3790:最短路径问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41505957/article/details/83348461

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41505957/article/details/83348461