代码:
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pi pair<int, int>
#define go second
#define age first
int n, m, s, dis[114514], vis[114514];
vector < pi > v[114514];
void dij()
{
for (int i = 1; i <= n; i ++) dis[i] = 1e9;
dis[s] = 0;
priority_queue < pi > q;
q.push({0, s});
while (q.size())
{
auto t = q.top();
q.pop();
// cout << t.go << "\n";
if (vis[t.go]) continue;
vis[t.go] = 1;
cerr << "正在对 " << t.go << " 这个点尝试进行路径松弛\n";
for (auto gt : v[t.go])
{
int go_to = gt.go;
int go_qz = gt.age;
cerr << "正在尝试对连接的 " << go_to << " 这个点进行松弛,原来为 " << dis[go_to] << " 尝试更新为 " << dis[t.go] + go_qz << '\n';
if (dis[t.go] + go_qz < dis[go_to])
{
cerr << "更新了\n";
dis[go_to] = dis[t.go] + go_qz;
q.push({-dis[go_to], go_to});
}
}
}
}
signed main ()
{
cin >> n >> m >> s;
for ( int i = 1; i <= m; i ++ )
{
int x, y, z;
cin >> x >> y >> z;
v[x].push_back({z, y});
}
dij ();
for (int i = 1; i <= n; i ++){
cout << dis[i] << ' ';
}
return 0;
}