题解:把每个无法到达的点搜一遍,类似noip2014寻找道路,最后统计答案
//详细注释在代码里
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int M=30005;
int n,m,k,x,y,ans,t;
bool vis[M];
int head[M];
struct edge{
int to,next;
}e[M*7];
void add(int i,int j){
e[t].to=j;
e[t].next=head[i];
head[i]=t++;
}//存图
void del(int x){
for(int i=head[x];i!=-1;i=e[i].next)
vis[e[i].to]=1;//x联通的点也无法到达1(设x联通的点为y,若y可以到达1,则x也可以,反之亦然)
}
void dfs(int x){
vis[x]=1;ans--;
for(int i=head[x];i!=-1;i=e[i].next)
if(!vis[e[i].to]) dfs(e[i].to);//统计vis[i]没有被设为1的点,即可行点
}
void init()
{
memset(head,-1,sizeof(head));
cin>>n>>m>>k;
ans=n;//要求输出不可行点数,用n-可行点
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y),add(y,x);//建图
}
for(int i=1;i<=k;i++){
scanf("%d",&x);
del(x);//x为无法到达1的点
}
}
void work()
{
dfs(1);
printf("%d\n",ans);
}
int main()
{
init();
work();
return 0;
}