📜  门|门CS 2012 |第 58 题(1)

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

门|门CS 2012 |第 58 题

这道题目是一道经典的算法题,需要我们设计一个算法来判断一个有向图是否存在环。

问题描述

给定一个有向图,判断是否存在环。需要实现一个函数,输入有向图的结点个数和每个结点的出度和出边指向的结点编号,输出是否存在环。

分析

为了判断有向图是否存在环,我们可以使用拓扑排序算法。拓扑排序是一种经典的图算法,它可以用来判断一个有向图是否存在环,如果存在环,则无法进行拓扑排序。

在拓扑排序中,我们以入度为0的结点为起点开始遍历,并将其删除,同时删除以该结点为起点的所有边。重复这个过程,直到所有结点都被遍历完毕,如果遍历过程中没有结点可以作为起点,则该有向图存在环。

代码实现
from collections import deque

def topological_sort(n, out_edge):
    indeg = [0] * n
    for _, edges in out_edge.items():
        for v in edges:
            indeg[v] += 1
    q = deque([i for i in range(n) if indeg[i] == 0])
    cnt = 0
    while q:
        u = q.popleft()
        cnt += 1
        for v in out_edge[u]:
            indeg[v] -= 1
            if indeg[v] == 0:
                q.append(v)
    return cnt != n

这段代码实现了拓扑排序算法,其中 n 表示有向图的结点个数,out_edge 表示每个结点的出度和出边指向的结点编号。函数的返回值为布尔型,表示是否存在环。

总结

本题需要掌握拓扑排序算法,对于初学者来说可能比较难理解,需要多加练习,同时也需要注意边界情况的处理,比如有向图中存在孤立结点等情况。