11 tile 100pts
查看原帖
11 tile 100pts
1188058
141300hxl楼主2024/4/10 11:15
#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);
	}
}
2024/4/10 11:15
加载中...