| 比赛 |
2026.3.28 |
评测结果 |
AAAWWAWWWAAWAAAAWWAWWWA |
| 题目名称 |
Picking Flowers |
最终得分 |
51 |
| 用户昵称 |
rzzakioi |
运行时间 |
7.265 s |
| 代码语言 |
C++ |
内存使用 |
21.49 MiB |
| 提交时间 |
2026-03-28 11:03:54 |
显示代码纯文本
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int t,n,m,k,l,num[200005];
vector<int>pre[200005];
bool s[200005],d[200005],vis[200005],ans[200005],yes[200005];
int to[400005],nxt[400005],h[400005],cnt;
void add(int u,int v){
to[++cnt]=v;
nxt[cnt]=h[u];
h[u]=cnt;
}
queue<int>q;
void update(int u){
if(ans[u])return;
ans[u]=1;
for(auto x:pre[u]){
update(x);
}
}
int main(){
freopen("Flowers.in","r",stdin);
freopen("Flowers.out","w",stdout);
scanf("%d",&t);
while(t--){
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(yes,0,sizeof(yes));
memset(to,0,sizeof(to));
memset(nxt,0,sizeof(nxt));
memset(h,0,sizeof(h));
cnt=0;
scanf("%d%d%d%d",&n,&m,&k,&l);
int x;
for(int i=1;i<=k;i++){
scanf("%d",&x);
s[x]=1;
}
for(int i=1;i<=l;i++){
scanf("%d",&x);
d[x]=1;
}
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&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(num[u]+s[v]>num[v]){
pre[v].clear();
pre[v].push_back(u);
}
else if(num[u]+s[v]==num[v])pre[v].push_back(u);
num[v]=max(num[v],num[u]+s[v]);
if(d[v]&&num[v]==k)yes[v]=1;
q.push(v);
}
}
for(int i=1;i<=n;i++){
if(!yes[i])continue;
update(i);
}
// for(auto x:pre[6])printf("%d ",x);
for(int i=2;i<=n;i++){
printf("%d",ans[i]);
}
for(int i=0;i<=n;i++)pre[i].clear();
printf("\n");
}
return 0;
}