题目描述
做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。
输入
连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。
输出
在同一行中输出路径长度和收费总额,数据间用空格间隔。
样例输入
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
样例输出
3 40
think
开两个二维数组 一个用来记路径长度 一个用来记收费 然后直接Floyd就好
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
int e[505][505],dis[505][505];
int n,m;
void Floyd(int s,int z)
{
for(int k=0; k<n; k++)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(e[i][j]>e[i][k]+e[k][j]||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];
dis[i][j]=dis[i][k]+dis[k][j];
}
else
{
if(dis[i][j]>dis[i][k]+dis[k][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
}
}
printf("%d %d\n",e[s][z],dis[s][z]);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int s,z;
scanf("%d%d%d%d",&n,&m,&s,&z);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
{
e[i][j]=0;
dis[i][j]=0;
}
else
{
e[i][j]=inf;
dis[j][i]=inf;
}
}
}
for(int i=1;i<=m;i++)
{
int x,y,w,z;
scanf("%d%d%d%d",&x,&y,&w,&z);
e[x][y]=w;
e[y][x]=w;
dis[x][y]=z;
dis[y][x]=z;
}
Floyd(s,z);
}
return 0;
}
/***************************************************
User name: jk180140刘洋
Result: Accepted
Take time: 0ms
Take Memory: 180KB
Submit time: 2019-01-17 08:21:16
****************************************************/