题目链接:点击这里
题意:在战争中,所有城市都必须通过高速公路连接起来,这一点至关重要。 如果一个城市被敌人占领,则从该城市/往该城市的所有高速公路都将关闭。 我们必须立即知道是否需要维修其他高速公路以保持其余城市的连通性。 在标记了所有剩余高速公路的城市地图上,您应该告诉我们需要快速修复的高速公路数量。
思路:把给出的 m m m 条无向边存起来,在接下来的每次查询中,把 x x x 城市攻占,就相当于把不含 x x x 点的无向边连起来,统计此时连通块的数量,连通块的数量减 1 1 1 就是需要添加的边数。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct edge
{
int a, b;
}e[1000010];
int f[1000];
int find(int x)
{
if(f[x] != x) f[x] = find(f[x]);
return f[x];
}
int main()
{
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < m; i++)
scanf("%d%d", &e[i].a, &e[i].b);
while(k--)
{
int x;
scanf("%d", &x);
// 初始化并查集
for(int i = 1; i <= n; i++) f[i] = i;
for(int i = 0; i < m; i++)
{
if(e[i].a != x && e[i].b != x)
{
int fa = find(e[i].a), fb = find(e[i].b);
if(fa != fb) f[fa] = fb;
}
}
// 统计集合数目
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(i == x) continue;
if(f[i] == i) ans++;
}
printf("%d\n", ans - 1);
}
return 0;
}
微信公众号《算法竞赛求职》,致力于详细讲解竞赛和求职所涉及到的算法原理和模板。欢迎关注,一起交流进步!