比赛 2026.3.28 评测结果 AAAWWAWWWAAWAAAAWWAWWWA
题目名称 Picking Flowers 最终得分 51
用户昵称 小福鑫 运行时间 16.333 s
代码语言 C++ 内存使用 28.69 MiB
提交时间 2026-03-28 11:22:44
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n,m,k,l,x,u,v,num[200005],to[400005],nxt[400005],h[400005],cnt;
vector<int>pre[200005];
bool s[200005],d[200005],vis[200005],ans[200005],ok[200005];
void add(int a,int b){
	to[++cnt]=b;
	nxt[cnt]=h[a];
	h[a]=cnt;
}
queue<int>q;
void update(int u){
	if(ans[u])return;
	ans[u]=1;
	for(auto x:pre[u]){
		update(x);
	}
}
void init(){
    memset(num,0,sizeof(num));
	memset(s,0,sizeof(s));
	memset(d,0,sizeof(d));
	memset(vis,0,sizeof(vis));
	memset(ans,0,sizeof(ans));
	memset(ok,0,sizeof(ok));
	memset(to,0,sizeof(to));
	memset(nxt,0,sizeof(nxt));
	memset(h,0,sizeof(h)); 
	cnt=0;
}
signed main() {
	freopen("Flowers.in","r",stdin);
	freopen("Flowers.out","w",stdout);
	cin>>T;
	while(T--){
	    init();
        cin>>n>>m>>k>>l;
		for(int i=1;i<=k;i++){
		    cin>>x;
			s[x]=1;
		}
		for(int i=1;i<=l;i++){
		    cin>>x;
			d[x]=1;
		}
		for(int i=1;i<=m;i++){
			cin>>u>>v;
			add(u,v);
			add(v,u);
		}
		q.push(1);
		while(!q.empty()) {
			int u=q.front();
			q.pop();
			if(vis[u])continue;
			vis[u]=1;
			for(int i=h[u];i;i=nxt[i]){
				int v=to[i];
				if(vis[v])continue;
				pre[v].push_back(u);
				if(s[v]){
					if(num[u]+1>num[v]){
						pre[v].clear();
						pre[v].push_back(u);
					}
				}
                else pre[v].push_back(u);
				num[v]=max(num[v],num[u]+s[v]);
				if(d[v]&&num[v]==k)ok[v]=1;
				q.push(v);
			}
		}
		for(int i=1;i<=n;i++){
			if(!ok[i])continue;
			update(i);
		}
		for(int i=2;i<=n;i++){
		    cout<<ans[i];
		}
		for(int i=0;i<=n;i++)pre[i].clear();
		cout<<"\n";
	}
}