比赛 2026.3.28 评测结果 AAATTMTTTATTTTTTTTTTTTT
题目名称 Picking Flowers 最终得分 16
用户昵称 彭欣越 运行时间 40.422 s
代码语言 C++ 内存使用 158.00 MiB
提交时间 2026-03-28 11:17:12
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int T,n,m,k,l,dis[N];
int a[N],b[N],ans[N],mk[N];
int head[N],tot;
struct edge {
    int v,nxt;
}e[N*2];
struct node {
    int w,id;
    vector<int>v;
};
void add (int u,int v) {
    e[++tot].v=v;
    e[tot].nxt=head[u];
    head[u]=tot;
}
bool find (int x,vector<int>g) {
    int l=0,r=g.size()-1;
    while (l<r) {
        int mid=(l+r+1)/2;
        //if (r-l==1&&g[l]<x&&g[r]>x) break;
        if (g[mid]>x) r=mid-1;
        else l=mid;
    }
    if (g[l]==x) return 1;
    else return 0;
}
void bfs1 () {
    queue<int>q;
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    q.push(1);
    while (!q.empty()) {
        int u=q.front();
        q.pop();
        if (mk[u]) continue;
        mk[u]=1;
        for (int i=head[u];i;i=e[i].nxt) {
            int v=e[i].v;
            if (mk[v]) continue;
            dis[v]=dis[u]+1;
            q.push(v);
        }
    }
}
void bfs () {
    memset(mk,0,sizeof(mk));
    queue<node>q;
    q.push({0,1,vector<int>{1}});
    int jsq=0,cnt=0;
    while (!q.empty()) {
        node t=q.front();
        q.pop();
        if (b[t.id]) {
            int flag=0;
            vector<int>v1;
            v1=t.v;
            sort(v1.begin(),v1.end());
            flag=0;
            //for (int i=0;i<v1.size();i++) cout << v1[i] <<endl;
            for (int i=1;i<=k;i++) {
                if (!find(a[i],v1)) {
                    flag=1;
                    break;
                }
            }
            if (!flag) for (int i=0;i<v1.size();i++) ans[v1[i]]=1;
        }
        if (mk[t.id]&&t.w>dis[t.id]) continue;
        mk[t.id]=1;
        for (int i=head[t.id];i;i=e[i].nxt) {
            int v=e[i].v;
            if (mk[v]) continue;
            vector<int>v1;
            v1=t.v;
            v1.push_back(v);
            q.push({t.w+1,v,v1});
        } 
    } 
} 
int main () {
    freopen("Flowers.in","r",stdin);
    freopen("Flowers.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin >> T;
    while (T--) {
        tot=0;
        memset(head,0,sizeof(head));
        memset(ans,0,sizeof(ans));
        memset(mk,0,sizeof(mk));
        memset(b,0,sizeof(b));
        cin >> n >> m >> k >> l;
        for (int i=1;i<=k;i++) cin >> a[i];
        for (int i=1;i<=l;i++) {
            int x;
            cin >> x;
            b[x]=1;
        }
        for (int i=1;i<=m;i++) {
            int a,b;
            cin >> a >> b;
            add(a,b);
            add(b,a); 
        }
        bfs1();
        bfs();
        for (int i=2;i<=n;i++) cout << ans[i];
        cout <<endl;
    }
    return 0;
}