比赛 2026.3.28 评测结果 AAAAAAAAAAAAAAAAAAAAAAA
题目名称 Picking Flowers 最终得分 100
用户昵称 梦那边的美好ME 运行时间 6.981 s
代码语言 C++ 内存使用 18.21 MiB
提交时间 2026-03-28 09:24:50
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long

const ll N=210000,M=410000;

ll T;
ll n,m,k,l;
bool s[N],d[N],vis[N];
ll dis[N],nm[N],res[N],ans;
ll nxt[M],head[M],to[M],cnt;

void add(ll u,ll v){
	to[++cnt]=v;
	nxt[cnt]=head[u];
	head[u]=cnt;
}

void dfs(ll o){
	vis[o]=1;
	if (d[o]) res[o]=s[o];
	for (int i=head[o];i;i=nxt[i]){
		ll v=to[i];
		if (v==o) continue;
		if (dis[v]!=dis[o]+1) continue;
		if (!vis[v]) dfs(v);
		res[o]=max(res[o],res[v]+s[o]);
	}
}

queue <ll> q;
void bfs(){
	while (!q.empty()) q.pop();
	q.push(1);
	dis[1]=0;nm[1]=0;
	while (!q.empty()){
		ll u=q.front();q.pop();
		for (int i=head[u];i;i=nxt[i]){
			ll v=to[i];
			if (v==u) continue;
			if (dis[v]>dis[u]+1){
				dis[v]=dis[u]+1;
				nm[v]=nm[u]+s[v];
				q.push(v);
			}else if (dis[v]==dis[u]+1){
				nm[v]=max(nm[v],nm[u]+s[v]);
			}
		}
	}
}

void solve(){
	cin>>n>>m>>k>>l;
	cnt=0;
	for (int i=1;i<=n;i++){
		s[i]=0;d[i]=0;vis[i]=0;dis[i]=1e10,nm[i]=-1e10;res[i]=-1e10;
	}
	for (int i=1,x;i<=k;i++){
		cin>>x;s[x]=1;
	}
	for (int i=1,x;i<=l;i++){
		cin>>x;d[x]=1;
	}
	for (int i=1;i<=m;i++){
		ll u,v;
		cin>>u>>v;
		add(u,v);add(v,u);
	}
	bfs();
	dfs(1);
	for(int i=2;i<=n;i++){
		cout<<(nm[i]+res[i]-s[i]==k);
	}
	cout<<'\n';
	for (int i=1;i<=m*2;i++){
		head[i]=0;nxt[i]=0;to[i]=0;
	}
}

int main(){
	freopen("Flowers.in","r",stdin);
	freopen("Flowers.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>T;
	while (T--) solve();
	return 0;
}