Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37545 | 申东铉 | 【S】T2 | C++ | 解答错误 | 0 | 3136 MS | 39816 KB | 2430 | 2025-04-06 14:17:54 |
#include <bits/stdc++.h> #include <queue> #define int long long using namespace std; int n,m,k; int s[100005],g[100005],dis[100005]; bool b[100005],vis[100005]; int ans[100005]; vector <pair <int,int>> e[100005]; signed main () { cin >> n >> m >> k; for (int i = 1;i <= k;i++) { cin >> s[i]; b[s[i]] = 1; } sort (s + 1,s + k + 1); for (int i = 1;i <= m;i++) { int u,v,w; cin >> u >> v >> w; e[v].push_back(make_pair(u,w)); } for (int i = 1;i <= n;i++) { ans[i] = 1e18; } for (int i = 1;i <= log2(n);i++) { priority_queue <pair <int,int>> q; for (int j = 1;j <= n;j++) { if ((1 << i) & j) { dis[j] = 0; q.push(make_pair(0,j)); b[j] = 0; } else { dis[j] = 1e18; b[j] = 1; } } while (!q.empty()) { int u = q.top().second; q.pop(); for (auto at : e[u]) { int v = at.first,w = at.second; if (b[v]) { ans[v] = min(ans[v],dis[u] + w); } if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; if (!vis[v]) { vis[v] = 1; q.push(make_pair(-dis[v],v)); } } } } while (!q.empty()) { q.pop(); } for (int j = 1;j <= n;j++) { if ((1 << i) & j) { dis[j] = 1e18; b[j] = 1; } else { dis[j] = 0; q.push(make_pair(0,j)); b[j] = 0; } } while (!q.empty()) { int u = q.top().second; q.pop(); for (auto at : e[u]) { int v = at.first,w = at.second; if (b[v]) { ans[v] = min(ans[v],dis[u] + w); } if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; if (!vis[v]) { vis[v] = 1; q.push(make_pair(-dis[v],v)); } } } } } for (int i = 1;i <= n;i++) { cout << ans[i] << endl; } return 0; }