graph确定是否有循环


算法:

先获取点的列表,索引对应点的顺序,值对应能通向的节点的列表——>[ [1,2,3] , [2,4] , [3,4] , [ ] , [ ] ]

        给每个点标上标签,是否当前路线"now“ 和 该节点对应的邻节点,用列表与字典表示——> [ {"visited":False,"neighbours":neighbours} for neighbours in adj]

[{"visited":False,"neighbours":[1,2,3]},{"visited":False,{"visited":False,"neighbours":[2,4],{"visited":False,"neighbours":[3,4],{"visited":False,"neighbours":[ ]},{"visited":False,"neighbours":[ ]}

遍历每个节点:建立一个方法has_cycle对每个节点进行递归运算,判断该节点的visited是否为当前,若不是则对该节点的visited设置为当前,然后对该节点的邻节点进行递归,如果该邻节点是当前,则已经完成循环(因为当前都是在这一次遍历建立的),如果不是,继续递归该邻节点的邻节点,当走到deadend时候,将该节点的当前设置为False。返回上一个递归,获取上一个递归的节点的下一个邻节点,重复判断。

#Uses python3

import sys

def has_cycle(node,nodes):
    if node["visited"] == 'now':
        return 1
    node["visited"]='now'
    for neighbour_index in node["neighbours"]:
        if has_cycle(nodes[neighbour_index],nodes):
            return 1
    node["visited"]=False
    return 0
def acyclic(adj):
    return 0

if __name__ == '__main__':
    input = sys.stdin.read()
    data = list(map(int, input.split()))
    n, m = data[0:2]
    data = data[2:]
    edges = list(zip(data[0:(2 * m):2], data[1:(2 * m):2]))
    adj = [[] for _ in range(n)]
    for (a, b) in edges:
        adj[a - 1].append(b - 1)
    nodes = list(({"visited":False,"removed":False,"neighbours":neighbours}for neighbours in adj))
    print(acyclic(adj))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值