题目描述
做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。
输入
连续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>
#define inf 0x3f3f3f3f
typedef struct node
{
int l;//高速公路的长度;
int c;//收费额;
}node;
node a[501][501];//两城市间是否有关系;
node dis[501];
int visit[501];//标记数组;
int n,m,s,d;
void low_dis_m()//找最短路径,最少花费;
{
visit[s]=1;//起点开始;
int min,i,j,k,u;
for(i=0;i<n-1;i++)
{
min=inf;
for(j=0;j<n;j++)//找邻接点的最小路径;
{
if(!visit[j]&&min>dis[j].l)
{
min=dis[j].l;
u=j;
}
}
visit[u]=1;
for(k=0;k<n;k++)
{
if(a[u][k].l<inf)//u到k之间有公路;
{
if(dis[k].l>dis[u].l+a[u][k].l||((dis[k].l==dis[u].l+a[u][k].l)&&(dis[k].c>dis[u].c+a[u][k].c)))
//找最短路径,如果路径相等,则找最小花费;
{dis[k].l=dis[u].l+a[u][k].l;
dis[k].c=dis[u].c+a[u][k].c;
}
}
}
}
printf("%d %d\n",dis[d].l,dis[d].c);//输出到目标城市的最小距离,最小花费;
}
int main()
{
int t,v1,v2,i,j,w,z;
scanf("%d",&t);
while(t--)
{
memset(a,inf,sizeof(a));//注意初始化a数组为无穷大;
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
scanf("%d %d %d %d",&n,&m,&s,&d);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)
{
a[i][j].l=a[i][j].c=0;
}
}
for(i=1;i<=m;i++)
{
scanf("%d %d",&v1,&v2);
scanf("%d %d",&w,&z);
a[v1][v2].l=a[v2][v1].l=w;
a[v1][v2].c=a[v2][v1].c=z;
}
for(i=0;i<n;i++)
{
dis[i].l=a[s][i].l;//城市间的距离关系;
dis[i].c=a[s][i].c;//城市间的收费关系;
}
low_dis_m();
}
}
#define inf 0x3f3f3f3f
typedef struct node
{
int l;//高速公路的长度;
int c;//收费额;
}node;
node a[501][501];//两城市间是否有关系;
node dis[501];
int visit[501];//标记数组;
int n,m,s,d;
void low_dis_m()//找最短路径,最少花费;
{
visit[s]=1;//起点开始;
int min,i,j,k,u;
for(i=0;i<n-1;i++)
{
min=inf;
for(j=0;j<n;j++)//找邻接点的最小路径;
{
if(!visit[j]&&min>dis[j].l)
{
min=dis[j].l;
u=j;
}
}
visit[u]=1;
for(k=0;k<n;k++)
{
if(a[u][k].l<inf)//u到k之间有公路;
{
if(dis[k].l>dis[u].l+a[u][k].l||((dis[k].l==dis[u].l+a[u][k].l)&&(dis[k].c>dis[u].c+a[u][k].c)))
//找最短路径,如果路径相等,则找最小花费;
{dis[k].l=dis[u].l+a[u][k].l;
dis[k].c=dis[u].c+a[u][k].c;
}
}
}
}
printf("%d %d\n",dis[d].l,dis[d].c);//输出到目标城市的最小距离,最小花费;
}
int main()
{
int t,v1,v2,i,j,w,z;
scanf("%d",&t);
while(t--)
{
memset(a,inf,sizeof(a));//注意初始化a数组为无穷大;
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
scanf("%d %d %d %d",&n,&m,&s,&d);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)
{
a[i][j].l=a[i][j].c=0;
}
}
for(i=1;i<=m;i++)
{
scanf("%d %d",&v1,&v2);
scanf("%d %d",&w,&z);
a[v1][v2].l=a[v2][v1].l=w;
a[v1][v2].c=a[v2][v1].c=z;
}
for(i=0;i<n;i++)
{
dis[i].l=a[s][i].l;//城市间的距离关系;
dis[i].c=a[s][i].c;//城市间的收费关系;
}
low_dis_m();
}
}