#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 0x7fffffff;
const int MAXN = 105;
int n, e, s;//n个点,e条边,起点为s
int dis[MAXN], check[MAXN];//dis里的每个值都代表从起点到该店的距离,check代表这个距离目前是不是最优的距离,如果是最优距离才设为1
int graph[MAXN][MAXN];
int main() {
// Initialize graph and distances
cin >> n >> e;
for (int i = 1; i <= n; i++) {
dis[i] = inf; // 每个点距离都为无穷大
for (int j = 1; j <= n; j++) {
graph[i][j] = inf; // No edges initially
}
}
for (int i = 1; i <= e; i++) {
int a, b, c;
cin >> a >> b >> c; // Edge from a to b with weight c
graph[a][b] = c; // Store the edge weight
//如果是无向图还要把 graph[b][a] = c; 写上,但现在规定是有向的
}
cin >> s; // 起点
dis[s] = 0; // 起点和起点的距离当然是0了
for (int i = 1; i <= n; i++) {//循环n次
int minn = inf, minx = -1;
//每次循环要找距离目前起点最短路径上的顶点
for (int j = 1; j <= n; j++) {
if (dis[j] < minn && check[j] == 0) {//第一次最大循环的第一个小循环找到的minn肯定是0,而且minx是1
minn = dis[j];
minx = j;
}
}
if (minx == -1) break;
//找到最近路径上1的一点了,把点标记了
check[minx] = 1;
for (int j = 1; j <= n; j++) {//这个循环的目的是拿找到的minn的点去看有没有和这个点通往的,如果有,那就比较dis[minx] + graph[minx][j]和dis[j]
if (check[j] == 0 && graph[minx][j] < inf) {
if (dis[minx] + graph[minx][j] < dis[j]) {
dis[j] = dis[minx] + graph[minx][j];
}
}
}
}
// Output the shortest distances
for (int i = 1; i <= n; i++) {
if (dis[i] == inf) cout << "INF ";
else cout << dis[i] << " ";
}
return 0;
}
Dijkstra算法的前提是每个边的都是正数,如果有负数的情况那就不适用