题目描述
给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
输入描述:
第一行两个正整数 n 和 m 。 接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。
输出描述:
输出一个整数,表示答案
示例1
输入
4 2 1 2 3 4
输出
1
备注:
对于100%的数据,有n,m<=100000。
思路:并查集(DFS/BFS),ans为联通块个数减一
#include<iostream> #include<cstdio> #include<string> #include<queue> #include<stack> #include<map> #include<vector> #include<list> #include<set> #include<iomanip> #include<cstring> #include<cctype> #include<cmath> #include<cstdlib> #include<ctime> #include<cassert> #include<sstream> #include<algorithm> using namespace std; #define MAXN 1000005 #define INF 0x3f3f3f3f #define PI acos(-1.0) typedef long long ll; int p[MAXN]; int fa(int x) { return x==p[x]?x:p[x]=fa(p[x]); } int main() { int n,m,u,v; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) p[i]=i; int ans=n-1; while(m--) { scanf("%d%d",&u,&v); int x=fa(u),y=fa(v); if(x!=y) { p[x]=y; ans--; } } printf("%d\n",ans); return 0; }