| 比赛 |
2026.3.28 |
评测结果 |
AAATTTTTTTTTTTTTTTTTTTT |
| 题目名称 |
Picking Flowers |
最终得分 |
12 |
| 用户昵称 |
ychyyx |
运行时间 |
42.040 s |
| 代码语言 |
C++ |
内存使用 |
14.09 MiB |
| 提交时间 |
2026-03-28 10:13:18 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int T;
int n,m,k,l;
vector<int> g[200005];
int cnt;
bool s[200005];
int d[200005];
int u,v;
bool ans=0;
int dis[200005];
bool b[200005],bj[200005];
void dfs(int kk,int u,int e,int num,int kkk){
if(ans) return ;
if(kk>dis[e]) return;
if(kk==dis[e]&&u!=e) return;
if(u==e){
if(num==kkk)
ans=1;
return;
}
for(int j=0;j<g[u].size();j++){
int v=g[u][j];
if(!bj[v]){
bj[v]=1;
dfs(kk+1,v,e,num+s[v],kkk);
bj[v]=0;
}
}
}
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
bool check(int u){
int kkk=k;
for(int i=1;i<=n;i++) bj[i]=0;
bj[1]=1;
if(!s[u]) kkk++;
s[u]=1;
ans=0;
for(int i=1;i<=l;i++){
dfs(0,1,d[i],0,kkk);
}
if(kkk>k) s[u]=0;
return ans;
}
void work(){
scanf("%d%d%d%d",&n,&m,&k,&l);
for(int i=1;i<=n;i++) s[i]=0,g[u].clear();
for(int i=1;i<=k;i++){
scanf("%d",&u);
s[u]=1;
}
for(int i=1;i<=l;i++) scanf("%d",&d[i]);
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=n;i++) b[i]=0,dis[i]=0x3fffffff;
dis[1]=0;
while(!q.empty()) q.pop();
q.push(make_pair(0,1));
while(!q.empty()){
u=q.top().second;
q.pop();
if(b[u]) continue;
b[u]=1;
for(int j=0;j<g[u].size();j++){
v=g[u][j];
if(dis[v]>dis[u]+1){
dis[v]=dis[u]+1;
q.push(make_pair(dis[v],v));
}
}
}
for(int i=2;i<=n;i++){
cout<<check(i);
}
printf("\n");
}
int main(){
freopen("Flowers.in","r",stdin);
freopen("Flowers.out","w",stdout);
scanf("%d",&T);
while(T--){
work();
}
return 0;
}