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

Posted H_Cisco

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动规(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;

以上是关于动规(18)-并查集基础题——团伙的主要内容,如果未能解决你的问题,请参考以下文章

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

动规(20)-并查集基础题——打击犯罪

动规(20)-并查集基础题——打击犯罪

动规(20)-并查集基础题——打击犯罪

并查集团伙

Luogu P2024&P1892食物链&团伙(并查集拓展域)