| 比赛 |
2026.3.28 |
评测结果 |
AAAAAAAAAAAWAAAAAAAAAAA |
| 题目名称 |
Picking Flowers |
最终得分 |
96 |
| 用户昵称 |
PXCZM |
运行时间 |
8.793 s |
| 代码语言 |
C++ |
内存使用 |
27.92 MiB |
| 提交时间 |
2026-03-28 10:57:30 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n,m,k,l;
bool fs[200010],fd[200010];
vector<int>g[200010];
struct state
{
int x,deep,cnt,id;
};
state ms(int x,int deep,int cnt,int id)
{
state tmp;
tmp.x=x,tmp.deep=deep,tmp.cnt=cnt,tmp.id=id;
return tmp;
}
queue<state>q;
bool vis[200010],fans[200010];
int dep[200010],ct;
queue<int>ans;
vector<int>p1,p2,pr[200010];
int Max[200010];
void init()
{
ct=0;
while(q.size()) q.pop();
while(ans.size()) ans.pop();
p1.clear();
p2.clear();
for(int i=1;i<=n;i++)
{
fs[i]=fd[i]=vis[i]=fans[i]=0;
dep[i]=0;
Max[i]=-1;
g[i].clear();
pr[i].clear();
}
}
void solve()
{
cin>>n>>m>>k>>l;
init();
for(int i=1;i<=k;i++)
{
int tmp;
cin>>tmp;
fs[tmp]=1;
}
for(int i=1;i<=l;i++)
{
int tmp;
cin>>tmp;
fd[tmp]=1;
}
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
q.push(ms(1,0,0,0));
p1.push_back(-1);
p2.push_back(1);
while(q.size())
{
state h=q.front();
int x=h.x,deep=h.deep,cnt=h.cnt,id=h.id;
q.pop();
if(vis[x]&&deep>dep[x]) continue;
if(cnt>Max[x])
{
pr[x].clear();
Max[x]=cnt;
}
if(cnt==Max[x])
pr[x].push_back(id);
if(fd[x]&&cnt==k&&fans[x]==0)
{
fans[x]=1;
ans.push(x);
}
if(vis[x]) continue;
dep[x]=deep;
vis[x]=1;
for(int i:g[x])
{
if(vis[i]&&dep[i]<=deep) continue;
p1.push_back(id);
p2.push_back(i);
q.push(ms(i,deep+1,cnt+fs[i],++ct));
}
}
while(ans.size())
{
int x=ans.front();
ans.pop();
for(int i:pr[x])
{
int j=p1[i];
if(j==-1) continue;
int to=p2[j];
if(fans[to]) continue;
fans[to]=1;
ans.push(to);
}
}
for(int i=2;i<=n;i++) cout<<fans[i];
cout<<'\n';
}
int main()
{
freopen("Flowers.in","r",stdin);
freopen("Flowers.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int T;
cin>>T;
while(T--) solve();
return 0;
}