| 比赛 |
2026.3.28 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
Picking Flowers |
最终得分 |
100 |
| 用户昵称 |
终焉折枝 |
运行时间 |
8.113 s |
| 代码语言 |
C++ |
内存使用 |
22.34 MiB |
| 提交时间 |
2026-03-28 10:20:12 |
显示代码纯文本
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int MAXN = 2 * 1e5 + 5;
int n, m, k, l;
struct node{
int id, dis;
bool operator < (const node &other)const{
return dis > other.dis;
}
};
vector<int> G[MAXN];
bool vis[MAXN];
int d[MAXN];
bool fl[MAXN], aim[MAXN];
int des[MAXN];
int fr[MAXN], to[MAXN];
void shortest(int s){
priority_queue<node> q;
fr[s] = 0; d[s] = 0;
q.push({s, d[s]});
while(!q.empty()){
int u = q.top().id;
q.pop();
if(vis[u]) continue;
vis[u] = true;
for(auto v : G[u]){
if(d[v] > d[u] + 1){
d[v] = d[u] + 1;
fr[v] = max(fr[v], fr[u] + fl[v]);
q.push({v, d[v]});
}
else if(d[v] == d[u] + 1){
fr[v] = max(fr[v], fr[u] + fl[v]);
}
}
}
}
void dfs(int u){
vis[u] = 1;
if(aim[u]) to[u] = fl[u];
for(int v : G[u]){
if(d[v] == d[u] + 1){
if(!vis[v]) dfs(v);
to[u] = max(to[u], to[v] + fl[u]);
}
}
}
void init(){
memset(fl, 0, sizeof(fl));
memset(aim, 0, sizeof(aim));
memset(vis, 0, sizeof(vis));
memset(d, 0x3f, sizeof(d));
memset(fr, -0x3f, sizeof(fr));
memset(to, -0x3f, sizeof(to));
}
void solve(){
init();
cin >> n >> m >> k >> l;
for(int i = 1;i <= k;i ++){
int x; cin >> x;
fl[x] = 1;
}
for(int i = 1;i <= l;i ++){
cin >> des[i];
to[des[i]] = fl[des[i]];
aim[des[i]] = 1;
}
for(int i = 1;i <= n;i ++) G[i].clear();
for(int i = 1;i <= m;i ++){
int u, v; cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
shortest(1);
memset(vis, 0, sizeof(vis));
dfs(1);
for(int i = 2;i <= n;i ++){
if(fr[i] + to[i] - fl[i] == k) cout << "1";
else cout << "0";
}
cout << '\n';
}
int main(){
freopen("Flowers.in", "r", stdin);
freopen("Flowers.out", "w", stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
int t; cin >> t;
while(t --){
solve();
}
return 0;
}