sdnu 1217(简单并查集模板)+hdu1232 畅通工程+hdu1213 how many tables

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int n, m;
int fa[10010];
int find(int x)
{
	int r = x;
	while (r != fa[r])
	{
		r = fa[r];
	}
	int i = x, j;
	while (fa[i] != r)
	{
		j = fa[i];
		fa[i] = r;
		i = j;
	}
	return r;

}
void unite(int x, int y)
{
	x = find(x);
	y = find(y);
	if (x != y)
		fa[y] = x;
}
int main()
{
	while (scanf("%d%d", &n, &m) != EOF)
	{
		for (int i = 1; i <= n; i++)
		{
			fa[i] = i;
		}
		for (int i = 1; i <= m; i++)
		{
			int a, b;
			scanf("%d%d", &a, &b);
			unite(a, b);
		}
		int cnt = 0;
		for (int i = 1; i <= n; i++)
		{
			if (fa[i] == i)
			{
				cnt++;
			}
		}
		printf("%d\n", cnt);
	}
	return 0;
}

简单的并查集模板题,注意最好用循环查找模板,数据多,防超时。

畅通工程

也是模板题,但这是我刚做并查集的题。

阐述一下简单思路:

1.题目要求:输入测试用例,输出最少还需建设的道路。

2.思路:只需将每个输入实例,合并,看最后有几个根,即畅通工程所需的最少路。

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std; 
int N, M;
int fa[1100];
int find(int x)
{
	int r = x;
	while (r != fa[r])
	{
		r = fa[r];
	}
	int i = x,j;
	while (fa[i] != r)
	{
		j = fa[i];
		fa[i] = r;
		i = j;
	}
	return r;
}
void unite(int x, int y)
{
	x = find(x);
	y = find(y);
	if (x == y)
		return;
	fa[y] = x;
}
int main()
{
	while (scanf("%d", &N) != EOF)
	{
		if (N == 0)
		{
			break;
		}
		scanf("%d", &M);
		for (int i = 1; i <= N; i++)
		{
			fa[i] = i;
		}
		for (int i = 0; i < M; i++)
		{
			int a, b;
			scanf("%d%d", &a, &b);
			unite(a, b);
		}
		int h[1100];
		memset(h, 0, sizeof(h));
		for (int i = 1; i <= N; i++)
		{
			h[find(i)]=1;
		}
		int cnt = 0;
		for (int i = 1; i <= N; i++)
		{
			if (h[i])
				cnt+=1;
		}
		cout << cnt-1 << endl;
	}
	return 0;
}

3.how many tables

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std; 
int N, M, T;
int fa[1100];
int find(int x)
{
	int r = x;
	while (r != fa[r])
	{
		r = fa[r];
	}
	int i = x,j;
	while (fa[i] != r)
	{
		j = fa[i];
		fa[i] = r;
		i = j;
	}
	return r;
}
void unite(int x, int y)
{
	x = find(x);
	y = find(y);
	if (x == y)
		return;
	fa[y] = x;
}
int main()
{
	scanf("%d", &T);
	while (T--)
	{
		
		scanf("%d%d", &N, &M);
		for (int i = 1; i <= N; i++)
		{
			fa[i] = i;
		}
		for (int i = 0; i < M; i++)
		{
			int a, b;
			scanf("%d%d", &a, &b);
			unite(a, b);
		}
		int cnt = 0;
		for (int i = 1; i <= N; i++)
		{
			if (fa[i] == i)
			{
				cnt++;
			}
		}
		cout << cnt << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/fighting_yifeng/article/details/81367045