代码如下
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{int v,nxt,f;}e[200010];
struct edge
{int x,f;}a[1010];
int d,m,n,tot,cnt;
int head[1010],book[1010],mp2[1010];
void add(int x,int y)
{
e[++tot].v=y,e[tot].nxt=head[x],head[x]=tot,e[tot].f=1;
e[++tot].v=x,e[tot].nxt=head[y],head[y]=tot,e[tot].f=0;
}
void down(int step)
{
for(int i=head[step];i;i=e[i].nxt)
if(!book[e[i].v]&&e[i].f)
a[++cnt].x=e[i].v,a[cnt].f=0,book[e[i].v]=1,down(e[i].v);
}
void up(int step)
{
int num=0,mp[1010]={0},sum=0,mp1[1010];
for(int i=head[step];i;i=e[i].nxt)
if(!e[i].f)
{
num++;
if(!mp[e[i].v]) mp1[++sum]=e[i].v;
mp[e[i].v]++;
for(int j=head[e[i].v];j;j=e[j].nxt)
{
if(e[j].v==step) continue;
if(!mp[e[j].v]) mp1[++sum]=e[j].v;
mp[e[j].v]++;
}
}
for(int i=1;i<=sum;i++)
if(mp[mp1[i]]==num&&!book[mp1[i]])
book[mp1[i]]=1,a[++cnt].x=mp1[i],a[cnt].f=1;
}
int read()
{
char c=getchar();int x=0,f=1;
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
bool cmp(edge x,edge y){return x.x<y.x;}
signed main()
{
d=read(),m=read(),n=read();
for(int i=1,x,y;i<=m;i++) x=read(),y=read(),add(x,y);
for(int i=1,x;i<=n;i++) x=read(),a[++cnt].x=x,a[cnt].f=1,book[x]=1;
for(int i=1;i<=cnt;i++)
{
if(a[i].f) down(a[i].x);
up(a[i].x);
}
sort(a+1,a+1+cnt,cmp);
for(int i=1;i<=cnt;i++)
if(!mp2[a[i].x]) cout<<a[i].x<<" ",mp2[a[i].x]=1;
return 0;
}
40分,Wa6个点