萌新求调简单暴力代码
查看原帖
萌新求调简单暴力代码
220426
血色黄昏楼主2021/8/15 18:40

73pts,写的是和xht一样的双log,有神仙帮忙看看吗/kel

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k, T, ans = 0x3f3f3f3f3f3f3f3f, c[100010], s, t, d[100010];
bool vis[100010];
struct node{
	int v, w;
};
vector<node>l[100010];
int read()
{
    int x = 0,f = 1; 
	char c = getchar();
    while (c != EOF && !isdigit(c)) {if (c == '-') f = -1;c = getchar();}
    while (isdigit(c)) {x = x * 10 + c - '0';c = getchar();}
    return x * f;
}
void write(int x)
{
    if (x < 0) putchar('-'),x = -x;
    if (x > 9) write(x/10); 
	putchar(x%10+'0');
}
void writeln(int x){write(x),putchar('\n');}
vector<int>del;
void clear()
{
	l[s].clear();
	for(int i = 0;i < del.size();i ++)l[del[i]].pop_back();
	del.clear();
}
priority_queue<pair<int, int> >q;
int dij()
{
	memset(d, 0x3f, sizeof(d));
	memset(vis, false, sizeof(vis));
	while(! q.empty())q.pop();
	q.push(make_pair(0, s));
	d[s] = 0;
	while(q.size())
	{
		int x = q.top().second;
		q.pop();
		if(vis[x])continue;
		vis[x] = true;
		for(int i = 0;i < l[x].size();i ++)
		{
			int y = l[x][i].v, z = l[x][i].w;
			if(d[y] > d[x] + z)
			{
				d[y] = d[x] + z;
				q.push(make_pair(- d[y], y));
			}
		}
	}
	return d[t];
}
signed main() 
{
	T = read();
	while(T --)
	{
		ans = 0x3f3f3f3f3f3f3f3f;
		n = read();
		m = read();
		k = read();
		for(int i = 1;i <= m;i ++)
		{
			int u = read(), v = read(), w = read();
			if(u != v)l[u].push_back(node{v, w});
		}
		for(int i = 1;i <= k;i ++)c[i] = read();
		s = n + 1;
		t = n + 2;
		for(int i = 1;i <= 2 * n;i <<= 1)
		{
			for(int j = 1;j <= k;j ++)
			{
				if(c[j] & i)l[s].push_back(node{c[j], 0});
				else 
				{
					l[c[j]].push_back(node{t, 0});
					del.push_back(c[j]);
				}
			}
			ans = min(ans, dij());
			clear();
			for(int j = 1;j <= k;j ++)
			{
				if(c[j] & i == 0)l[s].push_back(node{c[j], 0});
				else 
				{
					l[c[j]].push_back(node{t, 0});
					del.push_back(c[j]);
				}
			}
			ans = min(ans, dij());
			clear();
		}
		cout<<ans<<endl;
		for(int i = 1;i <= n;i ++)l[i].clear();
	}
	return 0;
}
2021/8/15 18:40
加载中...