并查集算法题-We Are A Team-python实现

题目描述

【We Are A Team】

总共有 n 个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中,具体的:

1、消息构成为 a b c,整数 a、b 分别代表两个人的标号,整数 c 代表指令

2、c == 0 代表 a 和 b 在一个团队内

3、c == 1 代表需要判定 a 和 b 的关系,如果 a 和 b 是一个团队,输出一行’we are a team’,如果不是,输出一行’we are not a team’

4、c 为其他值,或当前行 a 或 b 超出 1~n 的范围,输出‘da pian zi’

输入描述

  1. 第一行包含两个整数 n,m(1<=n,m<100000),分别表示有 n 个人和 m 条消息
  2. 随后的 m 行,每行一条消息,消息格式为:a b c(1<=a,b<=n,0<=c<=1)
  3. 输出描述: 1、c ==1,根据 a 和 b 是否在一个团队中输出一行字符串,在一个团队中输出‘we are a team’,不在一个团队中输出’we are not a team’ 2、c 为其他值,或当前行 a 或 b 的标号小于 1 或者大于 n 时,输出字符串‘da pian zi’
  4. 如果第一行 n 和 m 的值超出约定的范围时,输出字符串”Null”。

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

5 7

1 2 0

4 5 0

2 3 0

1 2 1

2 3 1

4 5 1

1 5 1

输出

We are a team

We are a team

We are a team

We are not a team

示例2 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

5 6

1 2 0

1 2 1

1 5 0

2 3 1

2 5 1

1 3 2

输出

we are a team

we are not a team

we are a team

da pian zi

 参考链接:

算法学习笔记 : 并查集https://zhuanlan.zhihu.com/p/93647900

Python实现

class Solution:
    def __init__(self, n):
        self.n = n
        self.parents = {}
        self.rank = {}
        # 用一个rank记录每个根节点对应的树的深度
        # (如果不是根节点,其rank相当于以它作为根节点的子树的深度)。
        # 一开始,把所有元素的rank(秩)设为1。
        # 合并时比较两个根节点,把rank较小者往较大者上合并。
        for i in range(self.n + 1):
            self.parents[i] = i
            self.rank[i] = 1

    def find(self, x):  # 合并(路径压缩)
        if self.parents[x] == x:
            return x
        else:
            self.parents[x] = self.find(self.parents[x])
            return self.parents[x]

    # 用递归的写法实现对代表元素的查询:一层一层访问父节点,直至根节点(根节点的标志就是父节点是本身)。
    # 要判断两个元素是否属于同一个集合,只需要看它们的根节点是否相同即可。

    def merge(self, i, j):  # 合并
        x = self.find(i)
        y = self.find(j)  # 先找到两个根节点
        if self.rank[x] <= self.rank[y]:
            self.parents[x] = y
        else:
            self.parents[y] = x
        if self.rank[x] == self.rank[y] and x != y:
            self.rank[y] += 1  # 如果深度相同且根节点不同,则新的根节点的深度+1


while True:
    try:
        n,m=map(int,input().split())
        team = Solution(n)
        if m < 1 or m > 100000 or n < 1 or n > 100000:
            print("NULL")
            break
        for i in range(m):
            a, b, c = map(int, input().split())
            if a < 1 or a > n or b < 1 or b > n:
                print("da pian zi")
            if c == 0:
                team.merge(a, b)
            elif c == 1:
                if team.find(a) == team.find(b):
                    print("We are a team")
                else:
                    print("We are not a team")
            else:
                print("da pian zi")
    except:
        break

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值