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