8月5号 图论,拓扑排序入门

今天做图的题目,这里面涉及到一个非常重要的知识点,就是图的入门,然后还有一个就是花花酱的leetcode合集,这些做完之后可以想一想怎么开始在9月份之前完成初期的知识储备,加油啊!

拓扑排序的具体笔记记在ipad上

拓扑排序:从给定的图的所有边中「提取出该图的某一个拓扑序列」的过程,拓扑序列是一条满足图中有向边前后关系的序列,任一有向边起点在序列中一定早于终点出现。如果图中有环,则无法提取出拓扑序列。所以拓扑排序的一个重要应用是在给定的有向图中判定是否存在环路。

作者:GTAlgorithm
链接:https://leetcode-cn.com/problems/find-eventual-safe-states/solution/gtalgorithm-san-ju-hua-jiao-ni-wan-zhuan-xf5o/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

非常重要: 拓扑排序是找到图中入度为 00 的节点,以及仅由入度为 00 节点所指向的节点。

class Solution:
    def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:
        #图论:状态机
        #不成环
        #拓扑排序逆向
        #统计出度
        n = len(graph)
        edge = defaultdict(list)
        out = [0]*n
        q = deque([])
        #首先是将graph反向
        for i,node in enumerate(graph):
            out[i] = len(node)
            if not out[i]:
                q.append(i)
            else:
                for no in node:
                    edge[no].append(i)
        #然后是bfs的拓扑排序
        #非常重要: 拓扑排序是找到图中入度为 0 的节点,以及仅由入度为 0 节点所指向的节点(所指向的节点,所指向的节点。。。。)。即不会有环的存在
        while q:
            node = q.popleft()
            for ed in edge[node]:
                out[ed]-=1
                if not out[ed]:
                    q.append(ed)
        return [i for i in range(n) if not out[i]]

		
		
			
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值