题解 | #【模板】拓扑排序#
【模板】拓扑排序
https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c
import sys
from collections import deque
class AdjacencyGraph:
def __init__(self, n):
# 有向图采用边的方式构成图,图有n个节点
self.n = n
self.graph = [[] for _ in range(n)] # 生成一个包含 m 个空列表的列表。
self.indegree = [0] * n
def check_shape(self):
print(self.graph)
def add_edge(self, u, v):
# 由于索引是[0,n-1]一共16个数,所以需要进行减一操作
self.graph[u - 1].append(v - 1)
self.indegree[v - 1] += 1
def topological_sort(self):
# Use deque for efficient pop from the left
queue = deque([i for i in range(self.n) if self.indegree[i] == 0])
topo_order = []
while queue:
node = queue.popleft()
topo_order.append(node)
for neighbor in self.graph[node]:
self.indegree[neighbor] -= 1
if self.indegree[neighbor] == 0:
queue.append(neighbor)
# If topo_order does not contain all nodes, there is a cycle
if len(topo_order) != self.n:
return -1
return topo_order
n,m = map(int,input().split())
Graph = AdjacencyGraph(n)
# Graph.check_shape()
for i in range(m):
u, v = map(int,input().split())
Graph.add_edge(u, v)
# Graph.check_shape()
res = Graph.topological_sort()
if res!=-1:
res = [x + 1 for x in res]
# print(len(res),res)
print(" ".join(map(str, res)))
else:
print(-1)