| 比赛 |
2026.3.28 |
评测结果 |
AAATTTTTTTTTTTTTTTTTTTT |
| 题目名称 |
Picking Flowers |
最终得分 |
12 |
| 用户昵称 |
ChenBp |
运行时间 |
42.053 s |
| 代码语言 |
C++ |
内存使用 |
17.51 MiB |
| 提交时间 |
2026-03-28 11:07:38 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<vector>
using namespace std;
const int N=2e5+5;
int hd[N],to[N*2],nxt[N*2],num=1;
void add(int u,int v){
num++;
to[num]=v;
nxt[num]=hd[u];
hd[u]=num;
}
int t,n,m,k,l;
int s[N],d[N];
int dis[N];
bool ok[N];
vector<int>ve[N];
map<int,bool>mp;
bool dfs(int u,int cnt){//cout<<"?";
if(u==1){
if(cnt==k) return 1;
return 0;
}
int x=mp.count(u);
bool now=0;
for(auto i:ve[u]){
if(dfs(i,cnt+x)){
now=1;
}
}
return ok[u]|=now;
}
int main(){
freopen("Flowers.in","r",stdin);
freopen("Flowers.out","w",stdout);
cin>>t;
while(t--){
cin>>n>>m>>k>>l;
mp.clear();
for(int i=1;i<=k;i++){
cin>>s[i];
mp[s[i]]=1;
}
for(int i=1;i<=l;i++){
cin>>d[i];
}
memset(hd,0,sizeof(hd));
num=1;
for(int i=1;i<=m;i++) {
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
memset(dis,0x3f,sizeof(dis));
memset(ok,0,sizeof(ok));
for(int i=1;i<=n;i++){
ve[i].clear();
}
dis[1]=0;
queue<int>q;
q.push(1);
while(!q.empty()){
// printf("!");
int u=q.front();
q.pop();
for(int i=hd[u];i;i=nxt[i]){
int v=to[i];
if(dis[u]+1<dis[v]){
dis[v]=dis[u]+1;
ve[v].clear();
ve[v].push_back(u);
q.push(v);
}
if(dis[u]+1==dis[v]){
ve[v].push_back(u);
}
}
}
// for(int j=1;j<=n;j++){
// for(auto i:ve[j]){
// cout<<i<<" ";
// }cout<<endl;}
for(int i=1;i<=l;i++){
dfs(d[i],0);
}
for(int i=2;i<=n;i++){
if(ok[i]) cout<<1;
else cout<<0;
}
cout<<endl;
}
return 0;
}