比赛 2026.3.28 评测结果 AAAAAAAAAAAAAAAAAAAAAAA
题目名称 Picking Flowers 最终得分 100
用户昵称 xuyuqing 运行时间 10.028 s
代码语言 C++ 内存使用 17.49 MiB
提交时间 2026-03-28 09:52:55
显示代码纯文本

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <utility>
#include <vector>

using namespace std;

const int N = 233233;

int t;
int n;
int m;
int k;
int l;
bool s[N];
bool d[N];
vector<vector<int>> graph;

struct nod {
    int u;
    int sc;
    int cc;
    
    nod () = default;
    nod (int u, int sc, int cc) : u (u), sc (sc), cc (cc) {}
    
    bool operator< (const nod other) const {
        if (cc != other.cc) {
            return cc > other.cc;
        }
        return sc < other.sc;
    }
    
    bool operator> (const nod other) const {
        if (cc != other.cc) {
            return cc < other.cc;
        }
        return sc > other.sc;
    }
};

bool vis[N];
nod dis[N];
bool res[N];

void dfs (int u) {
    if (res[u]) {
        return;
    }
    res[u] = true;
    for (int i = 0; i < graph[u].size(); i++) {
        int v = graph[u][i];
        if (dis[v].cc + 1 != dis[u].cc) {
//            cout << u << ' ' << v << ' ' << 1 << endl;
            continue;
        }
        if (dis[v].sc + s[u] != dis[u].sc) {
//            cout << u << ' ' << v << ' ' << 2 << endl;
            continue;
        }
        dfs (v);
    }
}

int main () {
    
    freopen ("Flowers.in", "r", stdin);
    freopen ("Flowers.out", "w", stdout);
    
//    cin >> t;
    scanf ("%d", &t);
    for (int index = 1; index <= t; index++) {
//        cin >> n >> m >> k >> l;
        scanf ("%d %d %d %d", &n, &m, &k, &l);
        
        memset (s, 0, sizeof (s));
        for (int i = 1; i <= k; i++) {
            int num;
//            cin >> num;
            scanf ("%d", &num);
            s[num] = true;
        }
        memset (d, 0, sizeof (d)); 
        for (int i = 1; i <= l; i++) {
            int num;
//            cin >> num;
            scanf ("%d", &num);
            d[num] = true;
        }
        
        graph.clear();
        graph.resize(n + 1);
        for (int i = 1; i <= m; i++) {
            int u, v;
//            cin >> u >> v;
            scanf ("%d %d", &u, &v);
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        
        memset (vis, 0, sizeof (vis));
        for (int i = 1; i <= n; i++) {
            dis[i].u = i;
            dis[i].sc = 0;
            dis[i].cc = N;
        }
        priority_queue<nod> pq;
        vis[1] = true;
        dis[1].cc = 0;
        pq.emplace(1, 0, 0);
        
        while (!pq.empty()) {
            nod t = pq.top();
            int u = t.u;
            int sc = t.sc;
            int cc = t.cc;
            pq.pop();
            
            for (int i = 0; i < graph[u].size(); i++) {
                int v = graph[u][i];
                int nsc = t.sc + s[v];
                int ncc = t.cc + 1;
                nod newNod (v, nsc, ncc);
                
                if (newNod > dis[v]) {
                    dis[v] = newNod;
                    if (!vis[v]) {
                        vis[v] = true;
                        pq.push(newNod);
                    }
                }
            }
        }
        
//        cout << 1 << endl;
        
        memset (res, 0, sizeof (res));
        for (int i = 2; i <= n; i++) {
            if (!res[i] && d[i] && (dis[i].sc == k)) {
                dfs (i);
            }
        }
        
        for (int i = 2; i <= n; i++) {
            printf ("%d", int (res[i]));
        }
        printf ("\n");
    }
    
    return 0;
}