5-3 旅游规划

来源:互联网 发布:mac 隐藏dock 快捷键 编辑:程序博客网 时间:2024/04/28 19:02

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第1行给出4个正整数NN、MM、SS、DD,其中NN(2\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0~(N-1N−1);MM是高速公路的条数;SS是出发地的城市编号;DD是目的地的城市编号。随后的MM行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
输出样例:

3 40

测试点结果测试点 结果  得分/满分   用时(ms)  内存(MB)测试点1    答案正确    12/12   3   1测试点2    答案正确    5/5 1   1测试点3    答案正确    4/4 155 3测试点4    答案正确    4/4 386 3#include <stdio.h>#include <string.h>#define inf 500int e[500][500];int fare[500][500];int main(){    int n,m,s,d,i,j,k;    scanf("%d%d%d%d",&n,&m,&s,&d);    for(i = 0;i < n;i++)        for(j = 0;j < n;j++)        {            if(i == j)e[i][j] = 0;            else e[i][j] = inf;        }    // memset(fare,inf,sizeof(fare));    for(i = 0;i < m;i++)    {        int t1,t2,t3,t4;        scanf("%d%d%d%d",&t1,&t2,&t3,&t4);        e[t1][t2] = e[t2][t1] = t3;        fare[t1][t2] = fare[t2][t1] = t4;    }    for(k = 0;k < n;k++)    {        for(i = 0;i < n;i++)        {            for(j = 0;j < n;j++)            {                if((e[i][j] >= e[i][k] + e[k][j]))                {                    if((e[i][j] > e[i][k] + e[k][j]))                    {                        e[i][j] = e[i][k] + e[k][j];                        fare[i][j] = fare[i][k] + fare[k][j];                    }                    else if((e[i][j] = e[i][k] + e[k][j])&& (fare[i][k] + fare[k][j] < fare[i][j]))                    {                        fare[i][j] = fare[i][k] + fare[k][j];                    }                }            }        }    }    printf("%d %d\n",e[s][d],fare[s][d]);    return 0;}
0 0