【ybtoj 高效进阶 3.3】 【最短路径】 单元最短路径
题目
解题思路
Dijkstra每次找出最短的边加入集合
更新其他点到起点的距离
但是时间会爆
用堆优化直接取出最小
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define yty pair<int, int>
using namespace std;
priority_queue<yty> q;
struct lzf {
long long to, next, c;
} f[200200];
long long t, n, m, s, x, y, c, dis[100010], p[100010], head[100010];
void add(int x, int y, int c) {
f[++t].to = y;
f[t].c = c;
f[t].next = head[x];
head[x] = t;
}
int main() {
scanf("%lld%lld%lld", &n, &m, &s);
for (int i = 1; i <= m; i++) {
scanf("%lld%lld%lld", &x, &y, &c);
add(x, y, c);
}
memset(dis, 0x7f, sizeof(dis));
memset(p, 0, sizeof(p));
dis[s] = 0;
q.push(make_pair(0, s));
while (!q.empty()) {
int mi = q.top().second;
q.pop();
if (p[mi])
continue;
p[mi] = 1;
for (int j = head[mi]; j; j = f[j].next)
if (dis[f[j].to] > dis[mi] + f[j].c) {
dis[f[j].to] = dis[mi] + f[j].c;
q.push(make_pair(-dis[f[j].to], f[j].to));
}
}
for (int i = 1; i <= n; i++) printf("%lld ", dis[i]);
return 0;
}