並查集

http://blog.csdn.net/dellaserss/article/details/7724401/hdu1232#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
int pre[1000];
int find(int x)//查找根節點
{
	int r = x;
	while (pre[r]!=r)//返回根節點r
	{
		r = pre[r];
	}
	int i=x, j;
	while (pre[i] != r)//路徑壓縮
	{
		j = pre[i];
		pre[i] = r;
		i = j;
	}

	return r;
}
void join(int x, int y)//判斷x與y是否連通。若是不連通,就把它們所在的連通分支合併起來
{
	int fx = find(x), fy = find(y);
	if (fx != fy)
	{
		pre[fx] = fy;
	}
}
int t[1001];
int main()
{
	int n, m;
	int x, y;
	while (scanf("%d", &n) != EOF && n)
	{
		for (int i = 1; i <= n; i++)
		{
			pre[i] = i;
		}
		scanf("%d", &m);
		while (m--)
		{
			scanf("%d%d", &x, &y);
			join(x, y);
		}
		memset(t, 0, sizeof(t));
		for (int i = 1; i <= n; i++)
		{
			t[find(i)] = 1;
		}
		int ans = 0;
		for (int i = 1; i <= n; i++)
		{
			if (t[i])
				ans++;
		}
		printf("%d\n", ans - 1);
	}
	return 0;
}
相關文章
相關標籤/搜索