今天做图的题目,这里面涉及到一个非常重要的知识点,就是图的入门,然后还有一个就是花花酱的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]]