比赛 2026.3.28 评测结果 AAAWWWWWWWWWWWWWWWWWAWW
题目名称 Picking Flowers 最终得分 17
用户昵称 郑霁桓 运行时间 9.830 s
代码语言 C++ 内存使用 21.90 MiB
提交时间 2026-03-28 10:42:31
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,l,s[200005],d[200005],xx,yy,ds[200005],dis[200005],pp[200005];
int vs[200005],t[200005],p[200005],dds[200005],pds[200005],as[200005],pd[200005];
vector<int>v[200005],vv;
queue<int>q;
inline bool cp(int x,int y){
    return ds[x]<ds[y];
}
bool dfs(int x){
    bool tptp=0;
    vs[x]=1; 
    if(pd[x]&&x!=s[k]) return true;
    for(int i=0;i<v[x].size();i++){
        if(dis[v[x][i]]==dis[x]+1){
            if(vs[v[x][i]]) tptp|=as[v[x][i]];
            else tptp|=dfs(v[x][i]);
        }
    }
    as[x]|=tptp;
    return tptp;
}
int main(){
    freopen("Flowers.in","r",stdin);
    freopen("Flowers.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--){
        cin>>n>>m>>k>>l;
        vv.clear();
        k++;
        s[1]=p[1]=1;
        for(int i=1;i<=n;i++) p[i]=0,v[i].clear(),dds[i]=as[i]=pp[i]=0;
        for(int i=2;i<=k;i++) cin>>s[i],p[s[i]]=1;
        for(int i=1;i<=l;i++) cin>>d[i];
        for(int i=1;i<=m;i++){
            cin>>xx>>yy;
            v[xx].push_back(yy);
            v[yy].push_back(xx);
        }
        ds[1]=0,vs[1]=1;
        for(int i=2;i<=n;i++) ds[i]=1e9,vs[i]=0;
        while(!q.empty()) q.pop();
        q.push(1);
        while(!q.empty()){
            int tp=q.front();
            q.pop();
            for(int i=0;i<v[tp].size();i++){
                if(!vs[v[tp][i]]){
                    vs[v[tp][i]]=1;
                    ds[v[tp][i]]=ds[tp]+1;
                    q.push(v[tp][i]);
                }
            }
        }
        sort(s+1,s+k+1,cp);
        int ppp=1;
        for(int i=2;i<=k;i++){
            if(s[i]==s[i-1]){
                ppp=0;
                break;
            }
        }
        if(!ppp){
            for(int i=2;i<=n;i++) cout<<0;
            cout<<"\n";
            continue;
        }
        for(int i=1;i<=n;i++) dis[i]=1e9,vs[i]=0;
        for(int i=1;i<=k;i++) p[s[i]]=i;
        dis[s[k]]=0,vs[s[k]]=1;
        while(!q.empty()) q.pop();
        q.push(s[k]);
        while(!q.empty()){
            int tp=q.front();
            q.pop();
            for(int i=0;i<v[tp].size();i++){
                if(!vs[v[tp][i]]){
                    vs[v[tp][i]]=1;
                    dis[v[tp][i]]=dis[tp]+1;
                    q.push(v[tp][i]);
                }
            }
        }
        ppp=0;
        for(int i=1;i<=l;i++){
            if(ds[d[i]]==ds[s[k]]+dis[d[i]]) pd[d[i]]=1,ppp=as[d[i]]=1;
        }
        if(!ppp){
            for(int i=2;i<=n;i++) cout<<0;
            cout<<"\n";
            continue;
        }
        
        for(int i=1;i<=n;i++) vs[i]=t[i]=0;
        vs[1]=ppp=1;
        while(!q.empty()) q.pop();
        q.push(1);
        while(!q.empty()){
            int tp=q.front();
            vs[tp]=1;
            if(p[tp]){
                if(t[tp]!=p[tp]-1){
                    ppp=0;
                    break;
                }
                t[tp]=p[tp];
            }
            q.pop();
            for(int i=0;i<v[tp].size();i++){
                if(vs[v[tp][i]]) continue;
                if(t[v[tp][i]]<t[tp]){
                    t[v[tp][i]]=t[tp];
                    dds[v[tp][i]]=(p[tp]?1:dds[tp]+1);
                }else if(t[v[tp][i]]==t[tp]) dds[v[tp][i]]=min(dds[v[tp][i]],dds[tp]+1);
                if(!vs[v[tp][i]]){
                    vs[v[tp][i]]=1;
                    q.push(v[tp][i]);
                }
            }
        }
        if(!ppp){
            for(int i=2;i<=n;i++) cout<<0;
            cout<<"\n";
            continue;
        }
        for(int i=1;i<=n;i++) vs[i]=0,t[i]=k+1;
        vs[s[k]]=ppp=1;
        while(!q.empty()) q.pop();
        q.push(s[k]);
        while(!q.empty()){
            int tp=q.front();
            vs[tp]=1;
            if(p[tp]){
                if(t[tp]!=p[tp]+1){
                    ppp=0;
                    break;
                }
                t[tp]=p[tp];
            }
            q.pop();
            for(int i=0;i<v[tp].size();i++){
                if(vs[v[tp][i]]) continue;
                if(t[v[tp][i]]>t[tp]){
                    t[v[tp][i]]=t[tp];
                    pds[v[tp][i]]=(p[tp]?1:pds[tp]+1);
                }else if(t[v[tp][i]]==t[tp]) pds[v[tp][i]]=min(pds[v[tp][i]],pds[tp]+1);
                if(!vs[v[tp][i]]){
                    vs[v[tp][i]]=1;
                    q.push(v[tp][i]);
                }
            }
        }
        for(int i=2;i<=n;i++){
            if(dds[i]+pds[i]==dds[s[t[i]]]||p[i]) as[i]=1;
        }
        for(int i=1;i<=n;i++) vs[i]=0;
        dfs(s[k]);
        for(int i=2;i<=n;i++) cout<<as[i];
        cout<<"\n";
    }
    return 0;
}