数据结构实验之图论七:驴友计划
作者:互联网
数据结构实验之图论七:驴友计划
Description
做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。
Input
连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。
Output
在同一行中输出路径长度和收费总额,数据间用空格间隔。
Sample
Input
1
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
Output
3 40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define inf 0x3f3f3f3f
int cost[550][550], dis[550][550];//cost两座城市之间的过路费,dis为两座城市之间的距离
int N;
void floyd()//弗洛伊德算法
{
for (int k = 0; k < N; k++)//N个城市,也是中途历经的点
{
for (int i = 0; i < N; i++)//出发的城市
{
for (int j = 0; j < N; j++)//到达的城市
{
if (dis[i][j] >= dis[i][k] + dis[k][j])//如果从这i直接到j的距离长度大于等于从i中途经过其他点再到j点
{
if (dis[i][j] > dis[i][k] + dis[k][j])//如果距离长度大于则直接更新
{
dis[i][j] = dis[i][k] + dis[k][j];
cost[i][j] = cost[i][k] + cost[k][j];
}
else//当二者相等时,再比较过路费的大小
{
if (cost[i][j] > cost[i][k] + cost[k][j])//距离长度相等,距离和不需更新
cost[i][j] = cost[i][k] + cost[k][j];
}
}
}
}
}
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int M, s, d;
scanf("%d %d %d %d", &N, &M, &s, &d);
memset(cost, inf, sizeof(cost));
memset(dis, inf, sizeof(dis));
for (int i = 0; i < M; i++)
{
int c1, c2, length, charge;
scanf("%d %d %d %d", &c1, &c2, &length, &charge);
cost[c1][c2] = cost[c2][c1] = charge;
dis[c1][c2] = dis[c2][c1] = length;
}
floyd();
printf("%d %d\n", dis[s][d], cost[s][d]);
}
}
标签:图论,int,++,cost,驴友,c2,c1,数据结构,dis 来源: https://blog.csdn.net/qq_45885219/article/details/109968433