博客
关于我
7-4 愿天下有情人都是失散多年的兄妹 (25 分)
阅读量:261 次
发布时间:2019-03-01

本文共 1634 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要判断一对情侣是否可以结婚。根据题目要求,两个人如果有五代以内的共同祖先,就不能结婚。我们需要通过分析两人各自的五代祖先来确定他们是否可以结婚。

方法思路

  • 输入处理:首先读取输入数据,包括每个人的ID、性别、父亲ID和母亲ID。将这些信息存储在适当的数据结构中。
  • 构建祖先树:对于每个人,生成他们的五代以内的祖先集合。使用广度优先搜索的方法,从当前节点开始,逐层扩展,直到达到五代。
  • 判断关系:对于每一对情侣,分别生成他们的五代祖先集合。如果两个集合有交集,说明他们有共同的祖先,不能结婚;否则,如果是异性,能结婚。
  • 解决代码

    n = int(input())maxn = 100010father = [-1] * (maxn + 1)mother = [-1] * (maxn + 1)gender = [''] * (maxn + 1)for _ in range(n):    parts = input().split()    id = int(parts[0])    g = parts[1]    f = int(parts[2])    m = int(parts[3])    father[id] = f    mother[id] = m    gender[id] = gk = int(input())results = []def get_ancestors(x, depth):    visited = set()    current_level = [x]    for _ in range(depth):        next_level = []        for node in current_level:            if node != -1:                p = father[node]                m = mother[node]                next_level.append(p)                next_level.append(m)        current_level = next_level        for node in current_level:            if node != -1:                visited.add(node)    return visitedfor _ in range(k):    x, y = map(int, input().split())    if gender[x] == gender[y]:        results.append("Never Mind")        continue    x_ance = get_ancestors(x, 5)    y_ance = get_ancestors(y, 5)    if x_ance & y_ance:        results.append("No")    else:        results.append("Yes")print(' '.join(results))

    代码解释

  • 输入处理:读取输入数据并存储到相应的数组中,fathermother数组记录每个人的父亲和母亲ID,gender数组记录每个人的性别。
  • 构建祖先树get_ancestors函数使用广度优先搜索的方法,从当前节点开始,逐层扩展,记录五代以内的所有祖先。
  • 判断关系:对于每一对情侣,生成他们的五代祖先集合,检查是否有交集。如果有交集,输出"No";否则,输出"Yes"。如果两人性别相同,直接输出"Never Mind"。
  • 这个方法通过广度优先搜索高效地构建祖先树,并使用集合操作快速判断是否有共同祖先,确保了算法的正确性和效率。

    转载地址:http://yesa.baihongyu.com/

    你可能感兴趣的文章
    oracle中sql的case语句运用--根据不同条件去排序!
    查看>>
    Oracle中Transate函数的使用
    查看>>
    oracle中关于日期问题的汇总!
    查看>>
    Oracle中常用的语句
    查看>>
    Oracle中序列的操作以及使用前对序列的初始化
    查看>>
    oracle中新建用户和赋予权限
    查看>>
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    查看>>
    Oracle中的rownum 和rowid的用法和区别
    查看>>
    oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
    查看>>
    oracle中表和视图的区别,oracle中常用表和视图
    查看>>
    oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
    查看>>
    Oracle从11g导出后导入10g
    查看>>
    oracle从备份归档日志的方法集中回收
    查看>>
    oracle优化器analyzed,Oracle 学习之 性能优化(十三) 索引
    查看>>
    Oracle修改字段类型
    查看>>
    Oracle修改表或者字段的注释
    查看>>