from collections import deque n,m = map(int,input().split()) root = [0]*n #顶点矩阵,存储能够到达0~n-1的点 d = [[] for _ in range(n)] #存储0~1能够能够到达哪些点 route = deque([]) for i in range(m): u,v = map(int,input().split()) root[v-1]+=1 d[u-1].append(v-1) dp = [] route = deque([i for i in range(n) if not root[i]]) while len(route): j = route.popleft() dp.append(j+1) for i in d[j]: root[i] = root[i]-1 if root[i]==0: route.append(i) if len(dp)==n: print(*dp) else: print(-1)
我发现我每次写程序时间都超长了,必须要手动去改一下队列之类的
拓扑排序思路:
1、统计每个节点的入度数和邻接的节点。意思比如节点1,有2个点可以通过有向线跟它相连,入度数就是2;如果节点1可以到达点2,点3,那么邻接的点就是2、3;(注意:入度不需要统计具体的点,只需要统计数量就行)
2、将入度数为0的点放入队列
3、①选择队列里面的第一个节点②将这个节点存下来③将该节点的邻接点的入度数减1④将入度数为0的节点放进队列
4、循环3
5、统计存下的节点,如果节点数为n,那么存在拓扑序列,输出即可;反之,不存在,输出-1