比赛 2026.3.28 评测结果 AAATTTTTTTTTTTTTTTTTTTT
题目名称 Picking Flowers 最终得分 12
用户昵称 ychyyx 运行时间 42.040 s
代码语言 C++ 内存使用 14.09 MiB
提交时间 2026-03-28 10:13:18
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int T;
int n,m,k,l;
vector<int> g[200005];
int cnt;
bool s[200005];
int d[200005];
int u,v;
bool ans=0;
int dis[200005];
bool b[200005],bj[200005];
void dfs(int kk,int u,int e,int num,int kkk){
    if(ans) return ;
    if(kk>dis[e])    return;
    if(kk==dis[e]&&u!=e) return;
    if(u==e){
        if(num==kkk)
            ans=1;
        return;
    }
    for(int j=0;j<g[u].size();j++){
        int v=g[u][j];
        if(!bj[v]){
            bj[v]=1;
            dfs(kk+1,v,e,num+s[v],kkk);
            bj[v]=0;
        }
    }
}
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q; 
bool check(int u){
    int kkk=k;
    for(int i=1;i<=n;i++)   bj[i]=0;
    bj[1]=1;
    if(!s[u])   kkk++;
    s[u]=1;
    ans=0;
    for(int i=1;i<=l;i++){
        dfs(0,1,d[i],0,kkk);
    }
    if(kkk>k)   s[u]=0;
    return ans;
}
void work(){
    scanf("%d%d%d%d",&n,&m,&k,&l);
    for(int i=1;i<=n;i++)    s[i]=0,g[u].clear();
    for(int i=1;i<=k;i++){
       scanf("%d",&u);
       s[u]=1;
    }
    for(int i=1;i<=l;i++)   scanf("%d",&d[i]);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        g[u].push_back(v);
        g[v].push_back(u); 
    }
    for(int i=1;i<=n;i++)   b[i]=0,dis[i]=0x3fffffff;
    dis[1]=0;
    while(!q.empty())   q.pop();
    q.push(make_pair(0,1));
    while(!q.empty()){
        u=q.top().second;
        q.pop();
        if(b[u])    continue;
        b[u]=1;
        for(int j=0;j<g[u].size();j++){
            v=g[u][j];
            if(dis[v]>dis[u]+1){
                dis[v]=dis[u]+1;
                q.push(make_pair(dis[v],v));
            }
        }
    }
    for(int i=2;i<=n;i++){
        cout<<check(i);
    }
    printf("\n");
}
int main(){
    freopen("Flowers.in","r",stdin);
    freopen("Flowers.out","w",stdout);
    scanf("%d",&T);
    while(T--){
        work();
    }
    return 0;
}