定义   
    有向无环图中所有点构成的序列A满足对于图中每条边(x,y)
    x在A中总出现在y之前,则A是该图的一个拓扑序
    求解A的过程就称为拓扑排序

bfs
    核心:不断选择入度为 0 的点 x ,然后把 x 连向点的入度减 1

    建立空拓扑序A
    预处理所有点入度d[i],把所有入读为0的点入队
    取出队头节点x,把x加入拓扑序列A的末尾
    对于从x出发的每条边(x,y),把d[y]-1,若被减为0,则把y入队
    重复上两步直至队列为空

code

    void topsort()
    {
        queue<int> q;

        for( int i = 1; i <= n; i ++ )
            if( deg[i] == 0 )
                q.push( i );

        while( q.size() )
        {
            int x = q.front();
            q.pop();

            a[++ cnt] = x;

            for( int i = h[x]; i; i = ne[i] )
            {
                int y = e[i];
                deg[y] --;
                if( deg[y] == 0 )
                    q.push( y );
            }
        }
    }