848. 有向图的拓扑序列

摘要
Title: 848. 有向图的拓扑序列
Tag: 拓扑排序
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

848. 有向图的拓扑序列

  • 题意

    给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。
    请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。

  • 思路

    有向图的拓扑遍历,就是图的宽搜的应用
    定义:若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。

    有向无环图(DAG)一定存在拓扑序列

    有重边和自环怎么办?
    有环是会输出-1的,因为环上的点入度一定大于1,是没有突破口的
    重边不影响判断,多走几个边就是了

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    '''
    Author: NEFU AB-IN
    Date: 2022-03-02 21:20:54
    FilePath: \ACM\Acwing\848.py
    LastEditTime: 2022-03-02 21:26:53
    '''
    from collections import deque

    N = int(1e5 + 10)

    g = [[] for _ in range(N)]
    st = [0] * N
    deg = [0] * N #入度
    res = []
    q = deque()

    n, m = map(int, input().split())
    for i in range(m):
    a, b = map(int, input().split())
    g[a].append(b)
    deg[b] += 1

    for i in range(1, n + 1):
    if deg[i] == 0:
    q.appendleft(i)

    while q:
    t = q.pop()
    for j in g[t]:
    deg[j] -= 1
    if deg[j] == 0:
    q.appendleft(j)
    res.append(t)

    if len(res) == n:
    print(" ".join(map(str, res)))
    else:
    print(-1)

使用搜索:谷歌必应百度