社区讨论
11 tile 100pts
P5304[GXOI/GZOI2019] 旅行者参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lut8mxzd
- 此快照首次捕获于
- 2024/04/10 11:15 2 年前
- 此快照最后确认于
- 2024/04/10 16:23 2 年前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
int T, n, m, k, x, y, z, tot, vis[100001];
int head[100001], to[500001], nxt[500001], val[500001];
int is[100001], ans, key[100001], num;
void add(int u, int v, int w) {
for (int i = head[u]; i; i = nxt[i]) {
if (to[i] == v) {
if (w < val[i]) val[i] = w;
return ;
}
}
nxt[++tot] = head[u];
to[head[u] = tot] = v;
val[tot] = w;
}
int dis[100001];
priority_queue<pair<int, int>> que;
int dijstra(int s) {
memset(dis, 0x3f, sizeof dis);
memset(vis, 0, sizeof vis);
que.push({0, s});
dis[s] = 0;
while (!que.empty()) {
auto [w, u] = que.top();
que.pop();
if (vis[u]) continue;
if (is[u] && u != s) return u;
vis[u] = 1;
for (int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if (dis[v] > dis[u] + val[i]) {
dis[v] = dis[u] + val[i];
que.push({-dis[v], v});
}
}
}
return -1;
}
signed main() {
for (cin >> T; T; --T) {
cin >> n >> m >> k;
tot = 0;
memset(head, 0, sizeof head);
for (int i = 1; i <= m; i++) {
cin >> x >> y >> z;
add(x, y, z);
}
memset(is, 0, sizeof is);
for (int i = 1; i <= k; i++) {
cin >> x;
key[i] = x;
is[x] = 1;
}
ans = 0x7ffffffffff;
for (int i = 1; i <= k; i++) {
int j = dijstra(key[i]);
if (j != -1 && ans > dis[j])
ans = dis[j];
}
printf("%" PRId64 "\n", ans);
}
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...