题目描述
输入
输出
样例输入
样例输出
数据范围限制
思路
考试的时候觉得这题是最短路,但是没想出来。。。听完题,嗯???BFS???(沉思一会) SPFA就是BFS啊!!!
枚举绿洲作为起点,算每一个点的最短路,然后每个点的最短路选max。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans[100100],l[200100][2],next[100100],lz[100100];
int d[100100],q[100100],v[100100],h,t;
int n,m,k,num;
void bfs(int x){
memset(v,0,sizeof(v));
memset(d,0X3f,sizeof(d));
q[1]=x,h=0,t=1,d[x]=0;
while(h++<t){
int i=q[h];
int z=next[i];
while(z!=0){
if(!v[l[z][0]]){
v[l[z][0]]=1;
q[++t]=l[z][0];
d[q[t]]=min(d[q[t]],d[i]+1);//求最短路
}
z=l[z][1];
}
}//BFS
for(int i=1;i<=n;i++)
ans[i]=max(ans[i],d[i]);//记录每个点最长的最短路
}
int main(){
//freopen("oasis.in","r",stdin);
//freopen("oasis.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
scanf("%d",&lz[i]);
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
l[++num][0]=y;
l[num][1]=next[x];
next[x]=num;
l[++num][0]=x;
l[num][1]=next[y];
next[y]=num;//链表
}
for(int i=1;i<=k;i++)//枚举绿洲
bfs(lz[i]);
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
}