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; }
|