1. 程式人生 > >Newcoder 39 D.加邊的無向圖(並查集)

Newcoder 39 D.加邊的無向圖(並查集)

Description

給你一個 n n 個點, m m 條邊的無向圖,求至少要在這個的基礎上加多少條無向邊使得任意兩個點可達~

Input

第一行兩個正整數 n

n m m

接下來的 m m 行中,每行兩個正整數 i

j i 、 j ,表示點 i i 與點 j j
間有一條無向道路。

( n , m 1 0 5 ) (n,m\le 10^5)

Output

輸出一個整數,表示答案

Sample Input

4 2
1 2
3 4

Sample Output

1

Solution

並查集維護連通快個數即可,假設有 x x 個連通塊,答案即為 x 1 x-1

Code

#include<cstdio>
using namespace std;
const int maxn=100005;
int n,m,fa[maxn];
int find(int x)
{
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
void unite(int x,int y)
{
	x=find(x),y=find(y);
	if(x==y)return ;
	fa[x]=y;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)fa[i]=i;
	while(m--)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		unite(u,v);
	}
	int res=0;
	for(int i=1;i<=n;i++)
		if(fa[i]==i)res++;
	printf("%d\n",res-1);
	return 0;
}