Cow and Fields
题解如图
#include <bits/stdc++.h>
using namespace std;
//#define int long long
vector<int> st;
const int N=5e5+7;
int dis1[N],dis2[N],a[N],vis[N];
int ne[N],head[N],e[N],cnt;
typedef pair<int,int> pp;
int add(int a,int b)
{
e[cnt]=b,ne[cnt]=head[a],head[a]=cnt++;
}
void bfs(int ty,int x)
{
memset(vis,0,sizeof vis);
priority_queue<pp,vector<pp>, greater<pp> >q;
if(ty==1) dis1[x]=0;
else dis2[x]=0;
q.push({0,x});
if(ty==1) {
while (!q.empty()) {
auto t = q.top();
q.pop();
int u = t.second;
if (vis[u]) continue;
vis[u] = 1;
for (int i = head[u]; ~i; i = ne[i]) {
int j = e[i];
if (dis1[j] > dis1[u] + 1) {
dis1[j] = dis1[u] + 1;
q.push({dis1[j], j});
}
}
}
}else {
while(!q.empty()){
auto t=q.top(); q.pop();
int u=t.second;
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];~i;i=ne[i]){
int j=e[i];
if(dis2[j]>dis2[u]+1){
dis2[j]=dis2[u]+1;
q.push({dis2[j],j});
}
}
}
}
}
signed main()
{
int n,m,k;
memset(head,-1,sizeof head);
memset(dis2,0x3f3f3f3f,sizeof dis2);
memset(dis1,0x3f3f3f3f,sizeof dis1);
cin>>n>>m>>k;
for(int i=1;i<=k;i++) scanf("%d",a+i);
for(int i=1;i<=m;i++){
int a,b; scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
bfs(1,1);
bfs(2,n);
vector<pp> g;
for(int i=1;i<=k;i++){
g.push_back({dis1[a[i]]-dis2[a[i]],a[i]});
}
sort(g.begin(),g.end());
int res=0,tmp=0;
for(int i=0;i<g.size();i++){
if(i!=0){
res=max(res,tmp+dis1[g[i].second]+1);
}
tmp=max(tmp,dis2[g[i].second]);
}
cout<<min(res,dis1[n])<<endl;
}