本题是dijkstra算法的板子题,当然除此之外,还需要进行一些优化,
怎么优化呢?我们可以用堆对disdis数组进行维护,用较少的时间取出堆顶元素并删除,遍历每条边,总复杂度会相对较小。
下面附上代码
#include <iostream>
#include <queue>
using namespace std;
const int MaxN = 100005, MaxM = 500005;
struct edge
{
int t, d, n;
};
edge e[MaxM];
int head[MaxN], d[MaxN], cnt;
bool vis[MaxN];
int n, m, s;
inline void add_edge(int u, int v, int d)
{
cnt++;
e[cnt].d = d;
e[cnt].t = v;
e[cnt].n = head[u];
head[u] = cnt;
}
struct node
{
int d;
int pos;
bool operator <(const node& x)const
{
return x.d < d;
}
};
std::priority_queue<node> q;
inline void dijkstra()
{
d[s] = 0;
q.push((node) { 0, s });
while (!q.empty())
{
node tmp = q.top();
q.pop();
int x = tmp.pos, d = tmp.d;
if (vis[x])
continue;
vis[x] = 1;
for (int i = head[x]; i; i = e[i].next)
{
int y = e[i].to;
if (d[y] > d[x] + e[i].d)
{
d[y] = d[x] + e[i].d;
if (!vis[y])
{
q.push((node) { d[y], y });
}
}
}
}
}
int main()
{
cin >> n >> m >> s;
for (int i = 1; i <= n; ++i) d[i] = 0x7fffffff;
for ( int i = 0; i < m; ++i)
{
int u, v, d;
cin >> u >> v >> d;
add_edge(u, v, d);
}
dijkstra();
for (int i = 1; i <= n; i++)
cout << d[i] << " ";
return 0;
}