#include
#include
#define MAXN 10021
#define INF 0x7fffffff
using namespace std;
struct Edge {
int succ, value, next;
};
int n, m, s, t, flag;
int h[MAXN], vis[MAXN], dist[MAXN];
Edge graph[1000021];
int main() {
scanf("%d%d%d", &n, &m, &s);//读入,n为点数,m为边数,s为起点
flag = n;//用于记录扩展次数的变量
for (int i=1; i<=m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
graph[++t] = {b, c, h[a]};
h[a] = t;
} //读图
fill(dist+1, dist+n+1, INF);//赋各点到起点的距离为无穷大
dist[s] = 0;
while (flag--) {
int mini = INF, num = 0;
for (int i=1; i<=n; i++)
if (!vis[i]) {
num = dist[i] < mini ? i : num;
mini = min(mini, dist[i]);
}//找到还没被访问的与s距离最小的点num
vis[num] = 1;//将num扩展进集合
for (int i=h[num]; i; i=graph[i].next)
dist[graph[i].succ] = min(dist[graph[i].succ], dist[num] + graph[i].value);
}//对num的所有邻居更新dist
for (int i=1; i<=n; i++)
printf("%d ", dist[i]);//输出
puts("");//个人习惯,输出一个换行符,不写一样
return 0;
}
[洛谷]P3371 单源最短路径模板 Dijkstra
最新推荐文章于 2022-08-09 18:03:22 发布