粘题目咯:
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
输入格式说明:
输入说明:输入数据的第1行给出4个正整数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 |
2 | 2 1 0 1 1 0 2 3 | 2 3 |
这道题就是一道Dijastra算法题,存储时运用2个二维数组构建成邻接表来分别存储 两城市之间的距离和 需要的费用,注意点的就是 Dijastra算法 不仅需要判断 dist 还需要判断 acost
源码:
#include<iostream>
using namespace std;
#define MaxNum 10000
typedef int ElemType;
int main()
{
int N,M;
ElemType S,D;
cin>>N>>M>>S>>D;
//用邻接矩阵存储图
int **len = new int*[N]; //储存公路长度
int **cost = new int*[N]; //储存费用
for(int i=0; i<N; i++)
{
len[i] = new int[N];
cost[i] = new int[N];
}
//初始化
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
len[i][j] = MaxNum;
cost[i][j] = MaxNum;
}
}
//构建邻接矩阵,处理输入数据
for(int i=0;i<M;i++)
{
ElemType c1,c2;
int l,c;
cin>>c1>>c2>>l>>c;
len[c1][c2] = l;
len[c2][c1] = l;
cost[c1][c2] = c;
cost[c2][c1] = c;
}
//Dijastra算法开始
int *dist = new int[N]; //记录当前路径长度
int *acost = new int[N]; //记录当前花费
//初始化
for(int i=0;i<N;i++)
{
dist[i] = MaxNum;
acost[i] = MaxNum;
}
dist[S] = 0;
acost[S] = 0;
//进行算法
for(int k=0;k<2;k++)
{
for(int v=0;v<N;v++)
{
for(int w=0;w<N;w++)
{
if(dist[v] != MaxNum)
{
if(dist[v]+len[v][w] < dist[w])
dist[w] = dist[v] + len[v][w];
else if(dist[v] + len[v][w] == dist[w] && acost[v] != MaxNum && acost[v]+cost[v][w] <acost[w])
acost[w] = acost[v] + cost[v][w];
}
}
}
}
cout<<dist[D] << " " <<acost[D] <<endl;
return 0;
}