#include<iostream>
#include<cstring>
using namespace std;
const int MaxE = 1001;
int edge[MaxE][MaxE];
int visited[MaxE];
int N, M, K;
void dfs(int i)
{
visited[i] = 1;
for (int j = 1; j <= N; j++)
{
if (!visited[j] && edge[i][j] == 1)dfs(j);
}
}
int main()
{
cin >> N >> M >> K;
int i, j;
for (i = 0; i <= N; i++)
for (j = 0; j <= N; j++)
edge[j][i]=edge[i][j] = -1;
int C1, C2;
while (M--)
{
cin >> C1 >> C2;
edge[C1][C2] = edge[C2][C1] = 1;
}
while (K--)
{
int countarea = 0;
memset(visited, 0, sizeof(visited)); //每次输入一个新的去除点时,visited都应为0,memset初始化为同一元素,需要头文件include<cstring>
int C;
cin >> C;
visited[C] = 1;
for (int i = 1; i <=N; i++)
{
if (!visited[i])
{
dfs(i);
countarea++;
}
}
cout << countarea-1 << endl;
}
return 0;
}
/*3 2 3 1 2 1 3 1 2 3*/
关键在于去掉某个点之后看剩下几个集合,N个集合用N-1条边可以联系起来
此处用的dfs,去掉某个点可用访问过这一方式(因为访问过的点之后不再访问)
每次dfs一次,就能出现一个连通集,当所有的都visited之后就数完了所有的连通集