RT
用的堆优化,代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const int maxm = 500010;
struct edge
{
int to, val, nxt;
} e[maxm];
int head[maxn], tot;
int dis[maxn];
bool vis[maxn];
int n, m, s;
priority_queue< pair<int, int> > que;
inline void addedge(int u, int v, int val)
{
e[++tot].to = v;
e[tot].val = val;
e[tot].nxt = head[u];
head[u] = tot;
}
inline void dijkstra()
{
memset(dis, 0x7f, sizeof(dis));
memset(vis, 0, sizeof(vis));
dis[s] = 0;
que.push(make_pair(0, s));
while (que.size())
{
int x = que.top().second;
que.pop();
if (vis[x]) continue;
vis[x]=true;
for (int i = head[x]; i; i = e[i].nxt)
{
int y = e[i].to, z = e[i].val;
if (dis[y] > dis[x] + z)
{
dis[y]=dis[x]+z;
que.push(make_pair(-dis[y], y));
}
}
}
}
int main()
{
// freopen("dijkstraheap.in", "r", stdin);
// freopen("dijkstraheap.out", "w", stdout);
cin >> n >> m >> s;
for (int i = 1; i <= m; ++i)
{
int u, v, val;
cin >> u >> v >> val;
addedge(u, v, val);
}
dijkstra();
for(int i=1;i<=n;i++)
{
if(s==i)
{
cout<<0<<" ";
}
else
{
cout << dis[i] << endl;
}
}
return 0;
}