一些细节
1. 起点默认设置为5,可以自定义
2. 并不需要传递起点,起点的初始化体现在
dist[start] = 0;
3. visit为最后的输出数组
4.默认地点为正整数,因此设置mark0为true
mark[0] = true;
因此sit作为下标,从1开始,来确定在visit的插入位置
具体递归原理,自行理解;
测试数据
输入
5 7
1 2 2
1 5 1
2 3 1
2 4 1
2 5 2
3 5 1
3 4 1
输出
5 1 3 2 4
代码
#include<bits/stdc++.h>
using namespace std;
int vertex, edge;
vector< vector<int>>graph;
void InPut();
void Dijkstra(int, vector<int>, vector<bool>, vector<int>);
int main() {
InPut();
vector<int> visit(vertex + 1, 0);
vector<int> dist(vertex + 1, INT_MAX);
vector<bool> mark(vertex + 1, false);
int start{ 5 };
//scanf("%d", &start);
dist[start] = 0;
mark[0] = true;
Dijkstra(1, dist, mark, visit);
return 0;
}
void InPut(){
scanf("%d %d", &vertex, &edge);
graph.resize(vertex + 1);
for (int i = 0; i < vertex + 1; i++) {
graph[i].resize(vertex + 1);
fill(graph[i].begin(), graph[i].end(), INT_MAX);
}
int x, y, z;
for (int i = 0; i < edge; i++) {
scanf("%d %d %d", &x, &y, &z);
graph[x][y] = z;
graph[y][x] = z;
}
}
void Dijkstra(int sit, vector<int> dist, vector<bool> mark, vector<int> visit) {
if (sit == vertex + 1) {
bool flag{ false };
for (auto i : visit)
!flag ? flag = true : printf("%d ", i);
printf("\n");
return;
}
//找最小
int id, min{ INT_MAX };
for (int i = 0; i < vertex + 1; i++) {
if (mark[i] == false && dist[i] < min) {
min = dist[i];
id = i;
}
}
visit[sit] = id;
//更新mark,dist
mark[id] = true;
int x;
for (int i = 0; i < vertex + 1; i++) {
if (graph[id][i] != INT_MAX) {
if (mark[i] == false && dist[id] + graph[id][i] < dist[i]) {
dist[i] = dist[id] + graph[id][i];
}
}
}
Dijkstra(sit + 1, dist, mark, visit);
}