队列构造拓扑排序

拓扑排序复习 ==> 链接

将图进行拓扑排序之后,能在拓扑序列上做一些动态规划算法(DAG上的DP)

//Deg[]数组记录每一个顶点的入度
//N 为总顶点数,各个顶点编号1~N
for(int i=1; i<=N; i++)
    if(Deg[i] == 0)
        que.push(i);

while(!que.empty()){
    int v = que.front();
    que.pop();
    num++;//拓扑序列的顶点数
    //下面是访问 v 顶点的出度,这里使用静态邻接表写法
    for(int i=Head[v]; i!=-1; i=Edge[i].nxt){
        int Next_v = Edge[i].v;
        Deg[Next_v]--;//将出度顶点能到达的点的入度-1,相当于删边操作
        if(Deg[Next_v] == 0)
            que.push(Next_v);
    }
}

if(num != N){
    //不能构成合法的拓扑排序,比如有环的情况
}else{
    //...
}

 

posted @ 2018-02-08 16:27  qwerity  阅读(215)  评论(0编辑  收藏  举报