給你一個 n 個點,m 條邊的無向圖,求至少要在這個的基礎上加多少條無向邊使得任意兩個點可達~
阿新 • • 發佈:2019-02-07
給你一個 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; }