数据结构实验之图论七:驴友计划
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
1.floyd 算法
#include <iostream>
#include <cstring>
using namespace std;
int n,m,s,d;
const int Max = 505;
const int inf = 0x3f3f3f3f;
struct node
{
int len;
int val;
}map[Max][Max];
void floyd()
{
for (int k = 0; k < n; ++k)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if(map[i][j].len > map[i][k].len + map[k][j].len ||
(map[i][j].len == map[i][k].len + map[k][j].len && map[i][j].val > map[i][k].val + map[k][j].val))
{
map[i][j].len = map[i][k].len + map[k][j].len;
map[i][j].val = map[i][k].val + map[k][j].val;
}
}
}
}
}
int main(int argc, char const *argv[])
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m>>s>>d;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if(i == j)
map[i][j].len = 0;
else
map[i][j].len = inf;
}
}
for (int i = 0; i < m; ++i)
{
int a,b,c,v;
cin>>a>>b>>c>>v;
map[a][b].len = map[b][a].len = c;
map[a][b].val = map[b][a].val = v;
}
floyd();
cout<<map[s][d].len<<' '<<map[s][d].val<<endl;
}
return 0;
}
2.dijkstra
#include <iostream>
#include <cstring>
using namespace std;
#define inf 0x3f3f3f3f
int map[505][505];
int cost[505][505];
int dis[505];
void Dijk(int n,int v0,int vn)
{
int s[505];
int mon[505];
memset(s,0,sizeof(s));
for(int i = 0; i < n; ++i)
{
dis[i] = map[v0][i];
mon[i] = cost[v0][i];
}
s[v0] = 1;
dis[v0] = 0;
mon[v0] = 0;
for(int i = 1; i < n; ++i)
{
int min = inf;
int k = v0;
for(int j = 0; j < n; ++j)
{
if(!s[j] && dis[j] < min)
{
min = dis[j];
k = j;
}
}
s[k] = 1;
for(int j = 0; j < n; ++j)
{
if(dis[k] + map[k][j] < dis[j])
{
dis[j] = dis[k] + map[k][j];
mon[j] = mon[j] + cost[k][j];
}
else if(dis[k]+map[k][j] == dis[j] && mon[k] + cost[k][j] < mon[j])
{
mon[j] = mon[j] + cost[k][j];
}
}
}
cout<<dis[vn]<<' '<<mon[vn]<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m,s,d;
cin>>n>>m>>s>>d;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
if(i == j)
{
map[i][j] = 0;
}
else
map[i][j] = inf;
}
}
for(int i = 0; i < m; ++i)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
map[a][b] = map[b][a] = c;
cost[a][b] = cost[b][a] = d;
}
Dijk(n,s,d);
}
return 0;
}