| 比赛 |
2026.3.28 |
评测结果 |
AAAWWWWWWWWWWWWWWWWWAWW |
| 题目名称 |
Picking Flowers |
最终得分 |
17 |
| 用户昵称 |
郑霁桓 |
运行时间 |
9.830 s |
| 代码语言 |
C++ |
内存使用 |
21.90 MiB |
| 提交时间 |
2026-03-28 10:42:31 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,l,s[200005],d[200005],xx,yy,ds[200005],dis[200005],pp[200005];
int vs[200005],t[200005],p[200005],dds[200005],pds[200005],as[200005],pd[200005];
vector<int>v[200005],vv;
queue<int>q;
inline bool cp(int x,int y){
return ds[x]<ds[y];
}
bool dfs(int x){
bool tptp=0;
vs[x]=1;
if(pd[x]&&x!=s[k]) return true;
for(int i=0;i<v[x].size();i++){
if(dis[v[x][i]]==dis[x]+1){
if(vs[v[x][i]]) tptp|=as[v[x][i]];
else tptp|=dfs(v[x][i]);
}
}
as[x]|=tptp;
return tptp;
}
int main(){
freopen("Flowers.in","r",stdin);
freopen("Flowers.out","w",stdout);
ios::sync_with_stdio(false);
cin>>T;
while(T--){
cin>>n>>m>>k>>l;
vv.clear();
k++;
s[1]=p[1]=1;
for(int i=1;i<=n;i++) p[i]=0,v[i].clear(),dds[i]=as[i]=pp[i]=0;
for(int i=2;i<=k;i++) cin>>s[i],p[s[i]]=1;
for(int i=1;i<=l;i++) cin>>d[i];
for(int i=1;i<=m;i++){
cin>>xx>>yy;
v[xx].push_back(yy);
v[yy].push_back(xx);
}
ds[1]=0,vs[1]=1;
for(int i=2;i<=n;i++) ds[i]=1e9,vs[i]=0;
while(!q.empty()) q.pop();
q.push(1);
while(!q.empty()){
int tp=q.front();
q.pop();
for(int i=0;i<v[tp].size();i++){
if(!vs[v[tp][i]]){
vs[v[tp][i]]=1;
ds[v[tp][i]]=ds[tp]+1;
q.push(v[tp][i]);
}
}
}
sort(s+1,s+k+1,cp);
int ppp=1;
for(int i=2;i<=k;i++){
if(s[i]==s[i-1]){
ppp=0;
break;
}
}
if(!ppp){
for(int i=2;i<=n;i++) cout<<0;
cout<<"\n";
continue;
}
for(int i=1;i<=n;i++) dis[i]=1e9,vs[i]=0;
for(int i=1;i<=k;i++) p[s[i]]=i;
dis[s[k]]=0,vs[s[k]]=1;
while(!q.empty()) q.pop();
q.push(s[k]);
while(!q.empty()){
int tp=q.front();
q.pop();
for(int i=0;i<v[tp].size();i++){
if(!vs[v[tp][i]]){
vs[v[tp][i]]=1;
dis[v[tp][i]]=dis[tp]+1;
q.push(v[tp][i]);
}
}
}
ppp=0;
for(int i=1;i<=l;i++){
if(ds[d[i]]==ds[s[k]]+dis[d[i]]) pd[d[i]]=1,ppp=as[d[i]]=1;
}
if(!ppp){
for(int i=2;i<=n;i++) cout<<0;
cout<<"\n";
continue;
}
for(int i=1;i<=n;i++) vs[i]=t[i]=0;
vs[1]=ppp=1;
while(!q.empty()) q.pop();
q.push(1);
while(!q.empty()){
int tp=q.front();
vs[tp]=1;
if(p[tp]){
if(t[tp]!=p[tp]-1){
ppp=0;
break;
}
t[tp]=p[tp];
}
q.pop();
for(int i=0;i<v[tp].size();i++){
if(vs[v[tp][i]]) continue;
if(t[v[tp][i]]<t[tp]){
t[v[tp][i]]=t[tp];
dds[v[tp][i]]=(p[tp]?1:dds[tp]+1);
}else if(t[v[tp][i]]==t[tp]) dds[v[tp][i]]=min(dds[v[tp][i]],dds[tp]+1);
if(!vs[v[tp][i]]){
vs[v[tp][i]]=1;
q.push(v[tp][i]);
}
}
}
if(!ppp){
for(int i=2;i<=n;i++) cout<<0;
cout<<"\n";
continue;
}
for(int i=1;i<=n;i++) vs[i]=0,t[i]=k+1;
vs[s[k]]=ppp=1;
while(!q.empty()) q.pop();
q.push(s[k]);
while(!q.empty()){
int tp=q.front();
vs[tp]=1;
if(p[tp]){
if(t[tp]!=p[tp]+1){
ppp=0;
break;
}
t[tp]=p[tp];
}
q.pop();
for(int i=0;i<v[tp].size();i++){
if(vs[v[tp][i]]) continue;
if(t[v[tp][i]]>t[tp]){
t[v[tp][i]]=t[tp];
pds[v[tp][i]]=(p[tp]?1:pds[tp]+1);
}else if(t[v[tp][i]]==t[tp]) pds[v[tp][i]]=min(pds[v[tp][i]],pds[tp]+1);
if(!vs[v[tp][i]]){
vs[v[tp][i]]=1;
q.push(v[tp][i]);
}
}
}
for(int i=2;i<=n;i++){
if(dds[i]+pds[i]==dds[s[t[i]]]||p[i]) as[i]=1;
}
for(int i=1;i<=n;i++) vs[i]=0;
dfs(s[k]);
for(int i=2;i<=n;i++) cout<<as[i];
cout<<"\n";
}
return 0;
}