题目描述
给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
(无向边即这条边连接的两个点能相互到达)
输入描述
第一行两个正整数 n 和 m 。(1<=n,m<=10^5)
接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。
输出描述
输出一个整数,表示答案
样例输入
4 2 1 2 3 4
样例输出
1
提示
网络流是啥啊?
另一组样例:
输入:
6 3
1 5
5 2
3 4
输出:2
样例解释:按题目给出图是这样的
此时再加1条边就可全部连通。
#include<iostream>
using namespace std;
const int MAXN=100001;
int p[MAXN];
int fa(int x){
return x==p[x]?x:p[x]=fa(p[x]);
}
int main()
{
int n,m,u,v;
cin>>n>>m;
for(int i=1;i<=n;i++){
p[i]=i;
}
int ans=n-1;
while(m--){
cin>>u>>v;
int x=fa(u),y=fa(v);
if(x!=y){
p[x]=y;
ans--;
}
}
cout<<ans;
return 0;
}