📌  相关文章
📜  检查有向图顶点中的传入边是否等于顶点本身(1)

📅  最后修改于: 2023-12-03 15:26:48.514000             🧑  作者: Mango

检查有向图顶点中的传入边是否等于顶点本身

在有向图中,每个顶点通常会有若干个入度和出度。对于一个顶点,如果我们需要检查它的所有入边是否等于该顶点本身,该怎么实现呢?

方法

我们可以先遍历该顶点的所有入边,然后依次比较它们的起始点和该顶点是否相等即可。如果所有入边的起始点都等于该顶点本身,那么该顶点满足条件,否则不满足条件。

下面是一个示例代码:

def check_incoming_edges(vertex, edges):
    """
    检查有向图顶点中的传入边是否等于顶点本身
    :param vertex: 待检查顶点
    :param edges: 边集合,格式为 [(start, end), ...]
    :return: 如果所有入边的起始点都等于该顶点本身,返回 True,否则返回 False
    """
    for edge in edges:
        if edge[1] == vertex and edge[0] != vertex:
            return False
    return True

该方法接受两个参数:待检查的顶点和所有边的集合。其中,每条边的格式为 (start, end),表示从起始点 start 指向结束点 end。方法遍历所有入边,如果找到一条起始点不等于该顶点本身的边,那么该顶点不满足条件,直接返回 False。否则,如果所有入边的起始点都等于该顶点本身,就返回 True。

下面是一个简单的测试:

# 构造一个有向图
edges = [(1, 2), (3, 2), (4, 2), (2, 5), (2, 6), (2, 7), (8, 2)]

# 检查各个顶点的入边是否等于顶点本身
assert check_incoming_edges(1, edges) == True  # 1 没有入边
assert check_incoming_edges(2, edges) == True  # 2 的所有入边来自 1、3、4、8
assert check_incoming_edges(3, edges) == False # 3 的入边来自 1,不等于本身
assert check_incoming_edges(4, edges) == False # 4 的入边来自 1,不等于本身
assert check_incoming_edges(5, edges) == True  # 5 的唯一入边来自 2,等于本身
assert check_incoming_edges(6, edges) == True  # 6 的唯一入边来自 2,等于本身
assert check_incoming_edges(7, edges) == True  # 7 的唯一入边来自 2,等于本身
assert check_incoming_edges(8, edges) == False # 8 的入边来自 2,不等于本身

从输出可以看到,测试全部通过。