比赛 2026.3.28 评测结果 AAETTETAAEETETEEETTTTWE
题目名称 Picking Flowers 最终得分 16
用户昵称 exil 运行时间 26.616 s
代码语言 C++ 内存使用 231.58 MiB
提交时间 2026-03-28 11:15:18
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int> v[200005];
vector<int> dis[200005];
int mu[200005];
int pan[200005];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
void dsl(){
    dis[1][0]=0;
    q.push({0,1});
    while(!q.empty()){
        int dian=q.top().second;
        int bian=q.top().first;
        q.pop();
        for(int i = 0;i<v[dian].size();i++){
            
            
            if(dis[v[dian][i]][0]>bian+1){
                dis[v[dian][i]].clear();
                dis[v[dian][i]].push_back(bian+1);
                dis[v[dian][i]].push_back(dian);
                q.push({bian+1,v[dian][i]});
                
            }
            else if(dis[v[dian][i]][0]==bian+1){
                dis[v[dian][i]].push_back(dian);
                q.push({bian+1,v[dian][i]});
            }
        }   
    }
}
signed main(){
    freopen("Flowers.in","r",stdin);
    freopen("Flowers.out","w",stdout);
    int T;
    cin>>T;
    while(T--){
        int n,m,k,l;
        cin>>n>>m>>k>>l;
        for(int i = 1;i<=n;i++){
            v[i].clear();
            dis[i].clear();
            pan[i]=0;
        }
        queue<int> qq;
        for(int i = 1;i<=l;i++){
            cin>>mu[i];
            qq.push(mu[i]);
        }
        for(int i = 1;i<=m;i++){
            int u,vi;
            cin>>u>>vi;
            v[u].push_back(vi);
            v[vi].push_back(u);
        }
        for(int i = 1;i<=n;i++)dis[i].push_back(INT_MAX);
        dsl();
        while(!qq.empty()){
            pan[qq.front()]=1;
            //cout<<qq.front()<<" ";
            for(int i = 1;i<dis[qq.front()].size();i++){
                qq.push(dis[qq.front()][i]);
            }
            qq.pop();
        }
//        for(int i = 1;i<=n;i++){
//            cout<<dis[i].size()<<endl;
//            for(int j = 1;j<dis[i].size();j++)cout<<dis[i][j]<<" ";
//            cout<<endl;
//        }
        for(int i = 2;i<=n;i++){
            
            cout<<pan[i];
        }
        cout<<endl;
        
    }
    return 0;
}