| 比赛 |
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;
}