题解:P11591 [NordicOI 2024] Anime Shops
Night_sea_64 · · 题解
以下将有动漫商店的点记为关键点,其它点记为非关键点。
这题看起来显然需要用到 bfs。但是因为求
然后直接搜,搜到哪个非关键点就能直接知道非关键点的答案了。所以重点在于关键点的答案。
这里,我设当前有一个点
形象地说,整个 bfs 的过程像是
时间复杂度显然为
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
int n,m,k,id[100010],a[100010],cnt[100010],ans[100010];
vector<int>v[100010];
void bfs()
{
memset(ans,999999,sizeof(ans));
queue<int>q;
for(int i=1;i<=k;i++)
{
a[id[i]]=id[i];
q.push(id[i]);
}
while(!q.empty())
{
int x=q.front();
q.pop();
for(auto y:v[x])
if(a[y])
{
if(a[y]==a[x])continue;
ans[a[y]]=min(ans[a[y]],cnt[y]+cnt[x]+1);
ans[a[x]]=min(ans[a[x]],cnt[x]+cnt[y]+1);
}
else
{
a[y]=a[x],ans[y]=cnt[y]=cnt[x]+1;
q.push(y);
}
}
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=k;i++)cin>>id[i];
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
bfs();
for(int i=1;i<=n;i++)
if(ans[i]<=1e9)cout<<ans[i]<<" ";
else cout<<-1<<" ";
cout<<endl;
return 0;
}