这次实验包括两个部分:
1、图的基本操作
2、飞机最小换乘问题
对于图的操作,书上都有代码,在这里我就不贴出来了,下面是飞机最小换乘问题的解答:
题目要求:
(1)设有n个城市,编号为0~n-1,m条航线的起点和终点由用户输入提供。寻找一条换乘次数最少的线路方案。
(2)参考:可以使用有向图表示城市间的航线;只要两城市间有航班,则图中这两点间存在一条权值为1的边;可以使用Dijkstra算法实现。
#include <iostream>
#include <cstring>
using namespace std;
const int INF = (1 << 10); //设置一个相当于无穷的数
int n, m, ss; //设置全局变量
int w[10000][10000]; //记录路径初始状态
int path[10000]; //记录前驱结点
int d[10000]; //记录最短路径
int visit[10000]; //记录结点是否已经访问
void djikstra(int ss) //djikstra算法
{
d[ss] = 0; //对选择的地点进行初始化
visit[ss] = 1;
path[ss] = -1;
for (int i = 0; i < n; i++) { //根据读入数据更新
if (w[ss][i] != INF) {
d[i] = w[ss][i];
path[i] = ss;
}
}
for (int o = 0; o < n - 1; o++) { //o控制访问结点次数
int minP = INF; //minP储存路径的当前最小值
int temp; //temp储存路径最小值结点
for (int i = 0; i < n; i++) { //寻找最小路径
if (!visit[i] && d[i] < minP) {
temp = i;
minP = d[i];
}
}
for (int i = 0; i < n; i++) { //更新最短路径以及前驱结点
if (!visit[i] && d[i] > d[temp] + w[temp][i]) {
d[i] = d[temp] + w[temp][i];
path[i] = temp;
}
}
visit[temp] = 1;
}
}
void printPath()
{
for (int i = 0; i < n; i++) {
if (i == ss)
continue;
cout << i << "的前驱结点为" << path[i] << endl;
}
for (int i = 0; i < n; i++) {
if (i == ss)
continue;
cout << "所选地点到地点" << i << "的最少换乘次数是" << d[i] << endl;
}
}
int main()
{
cout << "请输入城市的数量和航线的数量:" << endl;
cin >> n >> m;
cout << "请输入出发的地点编号:" << endl;
cin >> ss;
cout << "请输入具体的航线(例如5 4):" << endl;
memset(path, -1, sizeof(path)); //几
memset(visit, 0, sizeof(visit)); //个
for (int i = 0; i < n; i++) { //数
d[i] = INF; //组
} //初
for (int i = 0; i < n; i++) { //始
for (int j = 0; j < n; j++) { //化
if (i == j) //.
w[i][j] = 0; //.
else //.
w[i][j] = INF; //.
} //.
} //.
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
w[a][b] = 1;
}
dijkstra(ss);
printPath();
system("pause");
return 0;
}
运行截图: