在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 我朋友的朋友是我的朋友; 我敌人的敌人是我的朋友; 我的敌人的朋友是我的敌人; 我的朋友的敌人是我的敌人; 所有是朋友的人组成一个团伙。告诉你关于这n个人的m 条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?直接给出代码
时间: 2024-03-27 20:35:42 浏览: 23
好的,以下是完整的代码实现:
```python
def find(x, parent):
if parent[x] != x:
parent[x] = find(parent[x], parent)
return parent[x]
def union(x, y, parent):
parent_x, parent_y = find(x, parent), find(y, parent)
if parent_x != parent_y:
parent[parent_x] = parent_y
def merge(x, y, parent):
parent_x, parent_y = find(x, parent), find(y, parent)
if parent_x != parent_y:
parent[parent_x] = -parent_y
parent[parent_y] = parent_x
n, m = map(int, input().split())
parent = [i for i in range(n + 1)]
for i in range(m):
op, x, y = map(int, input().split())
if op == 1:
union(x, y, parent)
else:
merge(x, y, parent)
ans = 0
for i in range(1, n + 1):
if parent[i] == i:
ans += 1
print(ans)
```
其中,find函数用于查找一个点所在的集合的代表元素,union函数用于合并两个朋友关系的集合,merge函数用于合并两个敌人关系的集合。最后,我们遍历每个点的parent数组,统计代表元素的数量即可。
时间复杂度为O(m alpha(n)),其中alpha(n)是阿克曼函数的反函数,可以认为是一个很小的常数。