LOJ 10081 道路与航线

题目链接

因为是没有负环的,所以可以用 spfa
好像有点卡?
用双端队列过了,听说双端队列优化是假的?
啊,这...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std;

const int N = 250005;
int n, r, p, s, dis[N], vis[N];
vector<int> e[N], w[N];

deque<int> q;
void spfa() {
memset(dis, 0x3f, sizeof dis);
q.push-back(s);
vis[s] = 1;
dis[s] = 0;
while (!q.empty()) {
int now = q.front();
q.pop-front(); vis[now] = 0;
for (int i = 0; i < e[now].size(); i++) {
int v = e[now][i], W = w[now][i];
if (dis[now] + W < dis[v]) {
dis[v] = dis[now] + W;
if (!vis[v]) {
vis[v] = 1;
if (q.empty()) q.push-back(v);
else if (dis[v] < dis[q.front()]) q.push-front(v);
else q.push-back(v);
}
}
}
}
}

int main() {
scanf("%d %d %d %d", &n, &r, &p, &s);
for (int i = 1; i <= r; i++) {
int u, v, a;
scanf("%d %d %d", &u, &v, &a);
e[u].push-back(v);
e[v].push-back(u);
w[u].push-back(a);
w[v].push-back(a);
}
for (int i = 1; i <= p; i++) {
int u, v, a;
scanf("%d %d %d", &u, &v, &a);
e[u].push-back(v);
w[u].push-back(a);
}
spfa();
for (int i = 1; i <= n; i++) {
if (dis[i] == 0x3f3f3f3f) puts("NO PATH");
else printf("%d\n", dis[i]);
}
return 0;
}


LOJ 10081 道路与航线
https://widsnoy.top/posts/d42/
作者
widsnoy
发布于
2020年9月13日
许可协议