动规(18)-并查集基础题——团伙
Posted H_Cisco
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动规(18)-并查集基础题——团伙相关的知识,希望对你有一定的参考价值。
在某城市里住着N个人,任何两个认识的人不是朋友就是敌人,而且满足:
1、 我朋友的朋友是我的朋友;
2、 我敌人的敌人是我的朋友;
所有是朋友的人组成一个团伙。告诉你关于这N个人的M条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?
输入
第一行包含一个整数N,第二行包含一个整数M,1<N<=1000,1<=M<=5000;
接下来M行描述M条信息,内容为以下两者之一:“0 X Y”表示X与Y是朋友;“1 X Y”表示X与Y是敌人。
输出
包含一个整数,即可能的最大团伙数。
样例输入
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)-并查集基础题——团伙的主要内容,如果未能解决你的问题,请参考以下文章