题解:P11591 [NordicOI 2024] Anime Shops
Solution
纯暴力思路。不知道为什么能过还跑得飞快。感觉可以被卡到
为叙述方便,以下称有动漫商店的点为黑点,其它为白点。
我们可以对于
然而,我这么写,获得了零分的好成绩!
:::error[零分代码]
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[100005];
vector<int> e[100005];
struct node{
int u,step;
};
queue<node> q;
int dis[100005];
int vis[100005];
void bfs(int st){
while(!q.empty())
q.pop();
q.push({st,0});
vis[st]=st;
while(!q.empty()){
int u=q.front().u,step=q.front().step;
q.pop();
// cout<<u<<" "<<dis[u]<<endl;
for(auto v:e[u]){
if(dis[v]<=step+1||vis[v]==st)
continue;
dis[v]=step+1;
q.push({v,step+1});
vis[v]=st;
}
}
return;
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
cin>>a[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=k;i++)
bfs(a[i]);
for(int i=1;i<=n;i++)
if(dis[i]==0x3f3f3f3f) cout<<-1<<" ";
else cout<<dis[i]<<" ";
return 0;
}
:::
求助于全知全能聪慧过人的 @JACK0927 为什么我的暴力没有 TLE 但是 WA,于是他送了我一个 hack,大家快去膜拜他!
:::info[hack] hack.in
9 9 2
1 7
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 1
hack.out
3 1 2 3 2 1 3 1 1
零分代码输出:
-1 1 2 3 2 1 3 1 1
:::
检查代码发现,这个算法不能很好地处理黑点。以上述 hack 为例:在以
考虑如何高效简便地解决这一问题。
我们在 BFS 时,用
于是我们解决了这一问题。
:::success[Code]
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[100005],f[100005];
vector<int> e[100005];
struct node{
int u,step;
};
queue<node> q;
int dis[100005],fa[100005];
int vis[100005];
void bfs(int st){
while(!q.empty())
q.pop();
q.push({st,0});
vis[st]=st;
while(!q.empty()){
int u=q.front().u,step=q.front().step;
q.pop();
for(auto v:e[u]){
if(dis[v]!=0x3f3f3f3f&&fa[v]!=st)
if(dis[v]+step+1<dis[fa[v]]){
dis[fa[v]]=dis[v]+step+1;
fa[fa[v]]=st;
}
if(dis[v]<=step+1||vis[v]==st)
continue;
dis[v]=step+1;
fa[v]=st;
q.push({v,step+1});
vis[v]=st;
}
}
return;
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
cin>>a[i],f[a[i]]=1;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=k;i++)
bfs(a[i]);
for(int i=1;i<=n;i++)
if(dis[i]==0x3f3f3f3f) cout<<-1<<" ";
else cout<<dis[i]<<" ";
return 0;
}
:::