考察并查集
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int tree[1001];
bool temp[1001][1001];
struct node
{
int a;
int b;
}Edge[500002];
int find(int x)
{
if(tree[x] == -1) return x;
else
return tree[x] = find(tree[x]);
}
int main()
{
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k) != EOF)
{
for(int i = 0; i < m; i++)
scanf("%d%d",&Edge[i].a,&Edge[i].b);
for(int i = 0; i < k; i++)
{
int c;
scanf("%d",&c);
memset(temp,false,sizeof(temp));
memset(tree,-1,sizeof(tree));
for(int i = 0; i < m; i++)
{
if(Edge[i].a != c && Edge[i].b != c)
{
int aa = Edge[i].a;
int bb = Edge[i].b;
int fa = find(aa);
int fb = find(bb);
if(fa != fb)
tree[fa] = fb;
}
}
int cnt = 0;
for(int i = 1; i <= n; i++)
if(i != c && tree[i] == -1)
cnt++;
printf("%d\n",cnt-1);
}
}
return 0;
}