比赛 2026.3.28 评测结果 AAAAAAAAAAAWAAAAAAAAAAA
题目名称 Picking Flowers 最终得分 96
用户昵称 PXCZM 运行时间 8.793 s
代码语言 C++ 内存使用 27.92 MiB
提交时间 2026-03-28 10:57:30
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n,m,k,l;
bool fs[200010],fd[200010];
vector<int>g[200010];
struct state
{
    int x,deep,cnt,id;
};
state ms(int x,int deep,int cnt,int id)
{
    state tmp;
    tmp.x=x,tmp.deep=deep,tmp.cnt=cnt,tmp.id=id;
    return tmp;
}
queue<state>q;
bool vis[200010],fans[200010];
int dep[200010],ct;
queue<int>ans;
vector<int>p1,p2,pr[200010];
int Max[200010];
void init()
{
    ct=0;
    while(q.size()) q.pop();
    while(ans.size()) ans.pop();
    p1.clear();
    p2.clear();
    for(int i=1;i<=n;i++)
    {
        fs[i]=fd[i]=vis[i]=fans[i]=0;
        dep[i]=0;
        Max[i]=-1;
        g[i].clear();
        pr[i].clear();
    }
}
void solve()
{
    cin>>n>>m>>k>>l;
    init();
    for(int i=1;i<=k;i++)
    {
        int tmp;
        cin>>tmp;
        fs[tmp]=1;
    }
    for(int i=1;i<=l;i++)
    {
        int tmp;
        cin>>tmp;
        fd[tmp]=1;
    }
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    q.push(ms(1,0,0,0));
    p1.push_back(-1);
    p2.push_back(1); 
    while(q.size())
    {
        state h=q.front();
        int x=h.x,deep=h.deep,cnt=h.cnt,id=h.id;
        q.pop();
        if(vis[x]&&deep>dep[x]) continue;
        if(cnt>Max[x])
        {
            pr[x].clear();
            Max[x]=cnt;
        }
        if(cnt==Max[x])
            pr[x].push_back(id);
        if(fd[x]&&cnt==k&&fans[x]==0)
        {
            fans[x]=1;
            ans.push(x);
        }
        if(vis[x]) continue;
        dep[x]=deep;
        vis[x]=1;
        for(int i:g[x])
        {
            if(vis[i]&&dep[i]<=deep) continue;
            p1.push_back(id);
            p2.push_back(i);
            q.push(ms(i,deep+1,cnt+fs[i],++ct));
        }
    }
    while(ans.size())
    {
        int x=ans.front();
        ans.pop();
        for(int i:pr[x])
        {
            int j=p1[i];
            if(j==-1) continue;
            int to=p2[j];
            if(fans[to]) continue;
            fans[to]=1;
            ans.push(to);
        }
    }
    for(int i=2;i<=n;i++) cout<<fans[i];
    cout<<'\n';
}
int main()
{
    freopen("Flowers.in","r",stdin);
    freopen("Flowers.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}