数据结构实验之图论七:驴友计划
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。
Input
连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。
Output
在同一行中输出路径长度和收费总额,数据间用空格间隔。
Example 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
Example Output
3 40
Hint
#include<stdio.h>
#include<math.h>
#define max 9999999
int n,m,s,d;
struct node
{
int length;
int money;
}road[500][500];
//初始化邻接矩阵图
void InitG()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
road[i][j].length=max;//两点之间的长度和路费全部初始化为无穷大
road[i][j].money=max;
}
}
}
//寻找最短路
//此函数运行完成后,任意两个点之间的路线长度均为最短
void findroad()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
if(road[k][j].length>road[k][i].length+road[i][j].length)
{
road[k][j].length=road[k][i].length+road[i][j].length;
road[k][j].money=road[k][i].money+road[i][j].money;
}
else if(road[k][j].length==road[k][i].length+road[i][j].length)//路线长度相同还要比较价格
{
if(road[k][j].money>road[k][i].money+road[i][j].money)
{
road[k][j].money=road[k][i].money+road[i][j].money;
}
}
}
}
}
printf("%d %d\n",road[s][d].length,road[s][d].money);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d %d",&n,&m,&s,&d);
InitG();
for(int i=0;i<m;i++)
{
int a,b,l,m;
scanf("%d %d %d %d",&a,&b,&l,&m);
road[a][b].length=road[b][a].length=l;
road[a][b].money=road[b][a].money=m;
}
findroad();
}
return 0;
}
//迪杰斯特拉算法11
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int inf=0x3f3f3f3f;
int mp[600][600][2],n;//0 luchag 1lufei
int dist[600][2],vis[600];
void dij(int s)
{
int i,j;
memset(vis,0,sizeof(vis));
vis[s]=1;
for(i=0;i<n;i++)
{
dist[i][0]=mp[s][i][0];
dist[i][1]=mp[s][i][1];
}
int max1,max2,u=s;
for(i=1;i<n;i++)
{
max1=max2=inf;
for(j=0;j<n;j++)
{
if(!vis[j] && ((dist[j][0]<max1) || (dist[j][0]==max1 && dist[j][1]<max2)) )
{
max1=dist[j][0];max2=dist[j][1];
u=j;
}
}
vis[u]=1;
for(j=0;j<n;j++)
{
if(!vis[j] && ((dist[j][0]>mp[u][j][0]+dist[u][0]) || (dist[j][0]==mp[u][j][0]+dist[u][0] && dist[j][1]>mp[u][j][1]+dist[u][1])) )
{
dist[j][0]=mp[u][j][0]+dist[u][0];dist[j][1]=mp[u][j][1]+dist[u][1];
}
}
}
}
int main()
{
int m,u,v,w,h;
int begin1,end1;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&n,&m,&begin1,&end1);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
mp[i][j][0]=mp[i][j][1]=inf;
}
}
while(m--)
{
scanf("%d%d%d%d",&u,&v,&w,&h);
mp[u][v][0]=w;
mp[v][u][0]=w;
mp[u][v][1]=h;
mp[v][u][1]=h;
}
dij(begin1);
printf("%d %d\n",dist[end1][0],dist[end1][1]);
}
return 0;
}