Unicom a un grafo no dirigido, todo un lado derecho, en el que hay clave k, la clave seleccionando una búsqueda de la adición punto máximo después de un 1 ~ n del borde de las más cortas
Solución
En \ (1, n \) a partir de la matriz BFS más corto, se hace referencia respectivamente como \ (a [], b [ ] \)
No hay puntos especiales de acuerdo con (x_i \) \ en orden ascendente, es fácil demostrar, para cada \ (x_i \) , sólo tienen que considerar \ (y_ {i + 1} \) a
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
vector <int> g[N];
int n,m,k,a[N],x[N],y[N],v[N],t1,t2;
bool cmp(int p,int q) {
return x[p]<x[q];
}
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=1;i<=k;i++) cin>>a[i];
for(int i=1;i<=m;i++) {
cin>>t1>>t2;
g[t1].push_back(t2);
g[t2].push_back(t1);
}
queue <int> qu;
memset(x,0x3f,sizeof x);
x[1]=0;
qu.push(1);
while(qu.size()) {
int p=qu.front();
qu.pop();
for(int q:g[p]) {
if(x[q]>x[p]+1) {
x[q]=x[p]+1;
if(v[q]==0) v[q]=1,qu.push(q);
}
}
}
memset(y,0x3f,sizeof x);
memset(v,0,sizeof v);
y[n]=0;
qu.push(n);
while(qu.size()) {
int p=qu.front();
qu.pop();
for(int q:g[p]) {
if(y[q]>y[p]+1) {
y[q]=y[p]+1;
if(v[q]==0) v[q]=1,qu.push(q);
}
}
}
sort(a+1,a+k+1,cmp);
int s=0;
for(int i=1;i<k;i++) {
s=max(s,min(x[n],min(x[a[i]]+y[a[i+1]],y[a[i]]+x[a[i+1]])+1));
}
cout<<s;
}