description
analysis
正解spfa
从kk个点每个跑一次最短路,每跑完一次统计最大值
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define MAXN 100005
#define MAXM MAXN*2
#define fo(i,a,b) for (register int i=a;i<=b;i++)
#define fd(i,a,b) for (register int i=a;i>=b;i--)
using namespace std;
int last[MAXM],next[MAXM],tov[MAXM];
int a[MAXN],f[MAXN],ans[MAXN];
bool bz[MAXN];
int n,m,k,tot;
queue<int>que;
__attribute__((optimize("-O3")))
int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0' || '9'<ch)
{
if (ch=='-')f=-1;
ch=getchar();
}
while ('0'<=ch && ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
__attribute__((optimize("-O3")))
void link(int x,int y)
{
next[++tot]=last[x];
last[x]=tot;
tov[tot]=y;
}
__attribute__((optimize("-O3")))
int main()
{
//freopen("readin.txt","r",stdin);
freopen("oasis.in","r",stdin);
freopen("oasis.out","w",stdout);
n=read(),m=read(),k=read();
fo(i,1,k)a[i]=read();
fo(i,1,m)
{
int x=read(),y=read();
link(x,y),link(y,x);
}
fo(j,1,k)
{
memset(f,60,sizeof(f));
memset(bz,1,sizeof(bz));
while (!que.empty())que.pop();
que.push(a[j]),bz[a[j]]=f[a[j]]=0;
while (!que.empty())
{
int now=que.front();
que.pop();
for (int i=last[now];i;i=next[i])
{
if (f[now]+1<f[tov[i]])
{
f[tov[i]]=f[now]+1;
if (bz[tov[i]])
{
bz[tov[i]]=0;
que.push(tov[i]);
}
}
}
bz[now]=1;
}
fo(i,1,n)ans[i]=max(ans[i],f[i]);
}
fo(i,1,n)printf("%d ",ans[i]);
return 0;
}