判断有向图是否有环及环中元素

主要思路: dfs+栈。具体来说,遍历图中每个节点,若该节点还未被访问,则调用dfs。在访问节点n时,若该节点不在栈中,则将其入栈,否则说明存在环,并且环中元素为栈中从节点n到栈顶的所有点。

# 输入:第一行为图中的边数,余下行为两个节点组成的边,以空格划分
例:
8
1 2
2 3
3 1
3 4
5 4
5 6
6 7
7 5

代码:

import sys

def dfs(node, graph, visited, stack):
    visited[node] = True
    stack.append(node)
    if node in graph:
        for n in graph[node]:
            if n not in stack:
                if not visited[n]:
                    dfs(n, graph, visited, stack)
            else:
                index = stack.index(n)
                print 'Circle: ',
                for i in stack[index:]:
                    print i,
                print n
    stack.pop(-1)


def main():
    graph = {}
    visited = {}
    stack = []
    num = int(sys.stdin.readline())
    for i in range(num):
        n1, n2 = sys.stdin.readline().strip().split(' ')
        if n1 not in graph:
            graph[n1] = [n2]
        elif n2 not in graph[n1]:
            graph[n1].append(n2)
        if n1 not in visited:
            visited[n1] = False
        if n2 not in visited:
            visited[n2] = False

    for node in visited.keys():
        if not visited[node]:
            dfs(node, graph, visited, stack)

if __name__ == "__main__":
    main()

示例:
以下图为例:

这里写图片描述!

输入及结果:

# 输入
8
1 2
2 3
3 1
3 4
5 4
5 6
6 7
7 5
# 输出
Circle:  1 2 3 1
Circle:  5 6 7 5
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值