比赛 2026.3.28 评测结果 AAATTTTTTTTTTTTTTTTTTTT
题目名称 Picking Flowers 最终得分 12
用户昵称 ChenBp 运行时间 42.053 s
代码语言 C++ 内存使用 17.51 MiB
提交时间 2026-03-28 11:07:38
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring> 
#include<queue>
#include<map>
#include<vector>
using namespace std;
const int N=2e5+5;
int hd[N],to[N*2],nxt[N*2],num=1;
void add(int u,int v){
    num++;
    to[num]=v;
    nxt[num]=hd[u];
    hd[u]=num;
}
int t,n,m,k,l;
int s[N],d[N];
int dis[N];
bool ok[N];
vector<int>ve[N];
map<int,bool>mp;
bool dfs(int u,int cnt){//cout<<"?";
    if(u==1){
        if(cnt==k) return 1;
        return 0;
    }
    int x=mp.count(u);
    bool now=0;
    for(auto i:ve[u]){
        if(dfs(i,cnt+x)){
            now=1;
        }
    }
    return ok[u]|=now;
}
int main(){
    freopen("Flowers.in","r",stdin);
    freopen("Flowers.out","w",stdout);
    cin>>t;
    while(t--){
        cin>>n>>m>>k>>l;
        mp.clear();
        for(int i=1;i<=k;i++){
            cin>>s[i];
            mp[s[i]]=1;
        }
        for(int i=1;i<=l;i++){
            cin>>d[i];
        }
        memset(hd,0,sizeof(hd));
        num=1;
        for(int i=1;i<=m;i++) {
            int u,v;
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        memset(dis,0x3f,sizeof(dis));
        memset(ok,0,sizeof(ok));
        for(int i=1;i<=n;i++){
            ve[i].clear();
        }
        dis[1]=0;
        queue<int>q;
        q.push(1);
        while(!q.empty()){
//            printf("!");
            int u=q.front();
            q.pop();
            for(int i=hd[u];i;i=nxt[i]){
                int v=to[i];
                if(dis[u]+1<dis[v]){
                    dis[v]=dis[u]+1;
                    ve[v].clear();
                    ve[v].push_back(u);
                    q.push(v);
                }
                if(dis[u]+1==dis[v]){
                    ve[v].push_back(u);
                }
            } 
        }
//        for(int j=1;j<=n;j++){
//        for(auto i:ve[j]){
//            cout<<i<<" ";
//        }cout<<endl;}
        for(int i=1;i<=l;i++){
            dfs(d[i],0);
        }
        for(int i=2;i<=n;i++){
            if(ok[i]) cout<<1;
            else cout<<0;
        }
        cout<<endl;
    }
    return 0;
}