吸氧82分求助
查看原帖
吸氧82分求助
478841
QAQWQ3Q楼主2022/2/7 18:44
#include<iostream>
#include<queue>
#include<cstring>
#define int long long
#define P pair<long long, long long>
using namespace std;
const int N = 1e5 + 100;
const int M = 5e5 + 100;
int cnt, Cnt, first[N], First[N];
struct Node
{
	int to, w, next;
}edge[M + N];
void add(int from, int to, int w)
{
	edge[++cnt].to = to;
	edge[cnt].w = w;
	edge[cnt].next = first[from];
	first[from] = cnt;
}
int n, m, k, s, t, ans;
int node[N], d[N], vis[N];
int dijkstra()
{
	for (int i = 1; i <= n + 2; ++i) d[i] = 1e16 + 9, vis[i] = 0;
	priority_queue<P, vector<P>, greater<P> > q;
	d[s] = 0;
	q.push(P(d[s], s));
	while (!q.empty())
	{
		int x = q.top().second;
		q.pop();
		if (vis[x]) continue;
		vis[x] = 1;
		if (x == t) break;
		for (int i = first[x]; i; i = edge[i].next)
		{
			int y = edge[i].to;
			int w = edge[i].w;
			if (d[x] + w < d[y])
			{
				d[y] = d[x] + w;
				q.push(P(d[y], y));
			}
		}
	}
	return d[t];
}
signed main()
{
	int T;
	cin >> T;
	while (T--)
	{
		cin >> n >> m >> k;
		s = n + 1;
		t = n + 2;
		ans = 1e16 + 9;
		memset(first, 0, sizeof(first));
		memset(First, 0, sizeof(First));
		cnt = Cnt = 0;
		for (int i = 1; i <= m; ++i)
		{
			int x, y, z;
			cin >> x >> y >> z;
			add(x, y, z);
		}
		for (int i = 1; i <= k; ++i)
		{
			cin >> node[i];
		}
		for (int i = 1; i <= n + 2; ++i) First[i] = first[i];
		Cnt = cnt;
		for (int i = 0; ((int)1 << i) <= k; ++i)
		{
			for (int j = 1; j <= k; ++j)
			{
				if (((int)1 << i) & node[j])
				{
					add(s, node[j], 0);
				}
				else
				{
					add(node[j], t, 0);
				}
			}
			ans = min(ans, dijkstra());
			for (int j = 1; j <= n + 2; ++j) first[j] = First[j];
			cnt = Cnt;
			for (int j = 1; j <= k; ++j)
			{
				if (((int)1 << i) & node[j])
				{
					add(node[j], t, 0);
				}
				else
				{
					add(s, node[j], 0);
				}
			}
			ans = min(ans, dijkstra());
			for (int j = 1; j <= n + 2; ++j) first[j] = First[j];
			cnt = Cnt;
		}
		cout << ans << endl;
	}
}
2022/2/7 18:44
加载中...