1. 题目
示例输入
4
0 2 10 10000
2 0 7 3
10 7 0 6
10000 3 6 0
0 2
示例输出
0
1
2
2. 代码
这一题和实验4.1类似,区别就是给定了初始点和结束点,并且需要输出路径而不是仅仅求出路径长度,因此需要path数组标记每个结点的前一个结点。
#include <iostream>
using namespace std;
typedef struct{
int n; //顶点数
int Edge[100][100];
}Graph;
Graph G;
bool visited[100];
int path[100];
int road[100];
int dist[100];
void createGraph(){
cin >> G.n;
for(int i=0; i<G.n; i++){
for(int j=0; j<G.n; j++){
cin >> G.Edge[i][j];
}
}
}
void Dijkstra(int s){
// 初始化
for(int i=0; i<G.n; i++){
dist[i] = G.Edge[i][s];
visited[s] = true;
path[i] = s;
}
path[s] = -1;
for(int k=1; k<G.n; k++){
int minn = 10000, now = 0;
// 找到最小的dist
for(int i=0; i<G.n; i++){
if(!visited[i] && dist[i] < minn){
minn = dist[i];
now = i;
}
}
// 将now(最短)标记为visited,并对dist进行更新
visited[now] = true;
for(int i=0; i<G.n; i++){
if(!visited[i]){
if(dist[now] + G.Edge[now][i] < dist[i]){
path[i] = now;
dist[i] = dist[now] + G.Edge[now][i];
}
}
}
}
}
int main(int argc, char** argv) {
int s, t;
createGraph();
cin >> s >> t;
Dijkstra(s);
int i=0;
while(t!=-1){
road[i++] = t;
t = path[t];
}
while(i--){
cout << road[i] << endl;
}
return 0;
}