动规(18)-并查集基础题——团伙

在某城市里住着N个人,任何两个认识的人不是朋友就是敌人,而且满足:

    1  我朋友的朋友是我的朋友;

    2  我敌人的敌人是我的朋友;

所有是朋友的人组成一个团伙。告诉你关于这N个人的M条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?

输入

第一行包含一个整数N,第二行包含一个整数M1<N<=1000,1<=M<=5000

接下来M行描述M条信息,内容为以下两者之一:“0 X Y”表示XY是朋友;“1 X Y”表示XY是敌人。

输出

包含一个整数,即可能的最大团伙数。

样例输入

6 4

1 1 4

0 3 5

0 4 6

1 1 2

样例输出

3

#include <cstdio>
#include <iostream>
using namespace std;
int fa[1001], vis[1001];
int n, m, s, i, x, y, z, r1, r2;
int find(int x)
{
	return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int main()
{
	cin >> n >> m;
	for (i = 1; i <= n; i++)
		fa[i] = i;
	for (i = 1; i <= m; i++)
	{
		cin >> z >> x >> y;
		if (z == 0)
		{
			r1 = find(x);
			r2 = find(y);
			fa[r2] = r1;
		}
		if (z == 1)
		{
			if (vis[x])
			{
				r1 = find(y);
				r2 = find(vis[x]);
				fa[r2] = r1;
			}
			else
				vis[x] = y;
			if (vis[y])
			{
				r1 = find(x);
				r2 = find(vis[y]);
				fa[r2] = r1;
			}
			else
				vis[y] = x;
		}
	}
	for (i = 1; i <= n; i++)
		if (fa[i] == i)
			s++;
	cout << s;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/hdq1745/article/details/126041482