Time Limit: 1000MS Memory limit: 65536K
题目描述
输入
连续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
提示
来源
//使用的是弗洛伊德算法,三层循环
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int N=500;
int mmap[N+10][N+10];
int vis[N+10];
int lowcost[N+10][N+10];
int main()
{
int T;
int N,M,s,d,u,v,w1,w2;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&N,&M,&s,&d);
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
if(i==j)
{
mmap[i][j]=mmap[j][i]=0;
lowcost[i][j]=lowcost[j][i]=0;
}
else
{
mmap[i][j]=inf;
lowcost[i][j]=inf;
}
}
}
for(int i=0;i<M;i++)
{
scanf("%d%d%d%d",&u,&v,&w1,&w2);
if(w1<mmap[u][v])
{
mmap[u][v]=mmap[v][u]=w1;
lowcost[u][v]=lowcost[v][u]=w2;
}
}
for(int k=s;k<=d;k++)
for(int i=s;i<=d;i++)
for(int j=s;j<=d;j++)
if(mmap[i][j]>(mmap[i][k]+mmap[k][j])||(mmap[i][j]==(mmap[i][k]+mmap[k][j])&&lowcost[i][j]>(lowcost[i][k]+lowcost[k][j])))
{
mmap[i][j]=mmap[i][k]+mmap[k][j];
lowcost[i][j]=lowcost[i][k]+lowcost[k][j];
}
printf("%d %d\n",mmap[s][d],lowcost[s][d]);
}
return 0;
}