题意
一个 n 个点,m 条边的无向图,加边使无向图联通
题解
并查集板子题
使联通的两点union,最后得到x棵树,即无向图的x个连通子图,两两之间填一条边即可得答案为x-1
Code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int fa[maxn]; //记录祖先节点
int fi(int x){ //find函数寻找祖先
return x == fa[x] ? x : fa[x] = fi(fa[x]);
}
void un(int x,int y){ //union函数建立两点关系
int p = fi(x);
int q = fi(y);
if(p != q) fa[p] = q;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1;i <= n;++i) fa[i] = i; //init
for(int i = 0;i < m;++i){
int u, v;
scanf("%d %d",&u,&v);
un(u,v);
}
int cnt = 0;
for(int i = 1;i <= n;++i){
if(fa[i] == i) cnt++; //寻找树根 即子图个数
}
printf("%d\n",cnt-1);
return 0;
} 
京公网安备 11010502036488号