社区讨论

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 条回复,欢迎继续交流。

正在加载回复...