https://codeforces.com/contest/1307/problem/D
最近在家状态太差了不敢打cf,果然补了补这道水题还WA了2发。。。难顶
反向bfs一遍,然后fdis存入set,然后正向dfs,每个状态的下的最优值就是正向已经找到的最大的dis+1+set中剩下反向最大的fdis
如果某个时刻>=fdis[1],就直接ans=fdis[1],因为本身的最短路肯定是存在的。
#include<bits/stdc++.h>
using namespace std;
const int maxl=2e5+10;
int n,m,k,cnt,ans,res,mx,mxf;
int a[maxl],ehead[maxl],dis[maxl],fdis[maxl];
struct ed
{
int to,nxt;
}e[maxl<<1];
bool vis[maxl],kk[maxl];
queue<int> q;
typedef pair<int,int> p;
set <p> s;
inline void add(int u,int v)
{
e[++cnt].to=v;e[cnt].nxt=ehead[u];ehead[u]=cnt;
}
inline void prework()
{
int u,v;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
{
scanf("%d",&a[i]);
kk[a[i]]=true;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
}
inline void mainwork()
{
int u,v;
memset(fdis,-1,sizeof(fdis));
fdis[n]=0;q.push(n);
while(!q.empty())
{
u=q.front();q.pop();
for(int i=ehead[u];i;i=e[i].nxt)
{
v=e[i].to;
if(fdis[v]<0)
{
fdis[v]=fdis[u]+1;
q.push(v);
}
}
}
for(int i=1;i<=k;i++)
s.insert(make_pair(fdis[a[i]],a[i]));
dis[1]=0;q.push(1);vis[1]=true;
if(kk[1])
{
s.erase(s.find(make_pair(fdis[1],1)));
if((*s.rbegin()).first+1>=fdis[1])
{
ans=fdis[1];
return;
}
ans=(*s.rbegin()).first+1;mx=0;
}
while(!q.empty())
{
u=q.front();q.pop();
for(int i=ehead[u];i;i=e[i].nxt)
{
v=e[i].to;
if(!vis[v])
{
dis[v]=dis[u]+1;
vis[v]=true;
if(kk[v])
{
mx=max(dis[v],mx);
s.erase(s.find(make_pair(fdis[v],v)));
if(s.begin()==s.end()) return;
ans=max((*s.rbegin()).first+mx+1,ans);
if(ans>=fdis[1])
{
ans=fdis[1];
return;
}
}
q.push(v);
}
}
}
}
inline void print()
{
printf("%d",ans);
}
int main()
{
prework();
mainwork();
print();
return 0;
}