| 比赛 |
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";
}
}