一、AcWing 848. 有向图的拓扑序列
【题目描述】
 给定一个
    
     
      
       
        n
       
      
      
       n
      
     
    n个点
    
     
      
       
        m
       
      
      
       m
      
     
    m条边的有向图,点的编号是
    
     
      
       
        1
       
       
        ∼
       
       
        n
       
      
      
       1\sim n
      
     
    1∼n,图中可能存在重边和自环。
 请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出
    
     
      
       
        −
       
       
        1
       
      
      
       -1
      
     
    −1。
 若一个由图中所有点构成的序列
    
     
      
       
        A
       
      
      
       A
      
     
    A满足:对于图中的每条边
    
     
      
       
        (
       
       
        x
       
       
        ,
       
       
        y
       
       
        )
       
      
      
       (x,y)
      
     
    (x,y),
    
     
      
       
        x
       
      
      
       x
      
     
    x在
    
     
      
       
        A
       
      
      
       A
      
     
    A中都出现在
    
     
      
       
        y
       
      
      
       y
      
     
    y之前,则称
    
     
      
       
        A
       
      
      
       A
      
     
    A是该图的一个拓扑序列。
【输入格式】
 第一行包含两个整数
    
     
      
       
        n
       
      
      
       n
      
     
    n和
    
     
      
       
        m
       
      
      
       m
      
     
    m。
 接下来
    
     
      
       
        m
       
      
      
       m
      
     
    m行,每行包含两个整数
    
     
      
       
        x
       
      
      
       x
      
     
    x和
    
     
      
       
        y
       
      
      
       y
      
     
    y,表示存在一条从点
    
     
      
       
        x
       
      
      
       x
      
     
    x到点
    
     
      
       
        y
       
      
      
       y
      
     
    y的有向边
    
     
      
       
        (
       
       
        x
       
       
        ,
       
       
        y
       
       
        )
       
      
      
       (x,y)
      
     
    (x,y)。
【输出格式】
 共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。
 否则输出
    
     
      
       
        −
       
       
        1
       
      
      
       -1
      
     
    −1。
【数据范围】
 
    
     
      
       
        1
       
       
        ≤
       
       
        n
       
       
        ,
       
       
        m
       
       
        ≤
       
       
        1
       
       
        
         0
        
        
         5
        
       
      
      
       1≤n,m≤10^5
      
     
    1≤n,m≤105
【输入样例】
3 3
1 2
2 3
1 3
 
【输出样例】
1 2 3
 
【代码】
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 100010, M = 100010;
int e[M], ne[M], h[N], idx;
int in[N], res[N], cnt;
int n, m;
void add(int u, int v)
{
    e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}
void topSort()
{
    queue<int> Q;
    for (int i = 1; i <= n; i++)
        if (!in[i]) Q.push(i);
    while (Q.size())
    {
        int t = Q.front();
        Q.pop();
        res[++cnt] = t;
        for (int i = h[t]; ~i; i = ne[i])
            if (!--in[e[i]]) Q.push(e[i]);
    }
}
int main()
{
    cin >> n >> m;
    memset(h, -1, sizeof h);
    while (m--)
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
        in[b]++;//b的入度++
    }
    topSort();
    if (cnt == n)
        for (int i = 1; i <= n; i++) cout << res[i] << ' ';
    else cout << -1 << endl;
    return 0;
}










