#include <bits/stdc++.h>
using namespace std;
const int maxn = 1111;
int n,m,k;
int father[maxn];
vector <int>G[maxn];
int currentPoint;
bool vis[maxn] = {false};
int findFather(int x)
{
int fa = x;
while(fa!=father[fa])
{
fa = father[fa];
}
//路径压缩
while(x != father[x])
{
int z = x;
x = father[x];
father[z] = fa;
}
return fa;
}
void Union(int a,int b)
{
int fa = findFather(a);
int fb = findFather(b);
if(fa != fb)
{
father[fa] = fb;
}
}
void init()
{
memset(vis,false,sizeof(vis));
for(int i = 1;i<=n;i++)
{
father[i] = i;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++)
{
int id1,id2;
scanf("%d%d",&id1,&id2);
G[id1].push_back(id2);
G[id2].push_back(id1);
}
for(int query=0;query<k;query++)
{
scanf("%d",¤tPoint);
init();
for(int i=1;i<n;i++)
{
for(int j=0;j<G[i].size();j++)
{
int u = i;
int v = G[u][j];
if(u == currentPoint || v == currentPoint)
continue;
Union(u,v);
}
}
int block=0;
for(int i = 1;i<=n;i++)
{
if(i == currentPoint)
continue;
int fa_i = findFather(i);
if(vis[fa_i] == false)
{
vis[fa_i] = true;
block++;
}
}
printf("%d\n",block-1);
}
return 0;
}
A1013 Battle Over Cities (25 分) - 并查集
最新推荐文章于 2022-02-27 16:31:54 发布