#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef unsigned long long ull;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
template<typename T> using min_heap=priority_queue<T,vector<T>,greater<T>>;
template<typename T> using max_heap=priority_queue<T>;
template<typename T> T isqrt(const T &x){T y=sqrt(x+2); while(y*y>x) y--; return y;}
const int INF = 1e18;
const int N = 2e6 + 5;
vector<int>arr3[N];
int a[N],n,m,k,vis[N],instk[N],flag;
int tme[N],can[N];
int stk[N],top;
void dfs(int u,int fa)
{
//cerr << u << endl;
if(!can[u] || flag) return ;
if(vis[u])
{
if(instk[u])
{
int x;
do
{
x = stk[top--];
instk[x] = 0;
} while (x != u);
flag = 1;
}
return ;
}
stk[++top] = u;
instk[u] = 1;
vis[u]++;
for(int v : arr3[u])
{
if(v == fa) continue;
dfs(v,u);
}
if(instk[u])
{
instk[u] = 0;
top--;
}
}
queue<pair<int,int>>q;
bool check(int x)
{
for(int i = 1;i <= n;i++) can[i] = vis[i] = 0;
top = 0;
int root = 1;
for(int i = 1;i <= n;i++)
{
if(tme[i] > x + 1) continue;
can[i] = 1;
}
flag = 0;
for(int i = 1;i <= n;i++)
{
if(vis[i]) continue;
dfs(i,0);
if(flag) return true;
}
return false;
}
void solve()
{
cin >> n >> m >> k;
for(int i = 1;i <= m;i++)
{
int u,v;
cin >> u >> v;
arr3[u].push_back(v);
arr3[v].push_back(u);
}
for(int i = 1;i <= k;i++) cin >> a[i];
for(int i = 1;i <= k;i++) q.push({a[i],1});
while(q.size())
{
auto [u,sum] = q.front();
q.pop();
if(tme[u]) continue;
tme[u] = sum;
for(int v : arr3[u])
{
if(tme[v]) continue;
q.push({v,sum + 1});
}
}
int l = 0,r = N;
while(l < r)
{
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
if(l < N) cout << l << endl;
else cout << "Poor D!" << endl;
return;
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0);
int tt = 1;
while(tt--)
{
solve();
}
return 0;
}
把vector改成前向星就过了,有大佬知道为啥吗