1. 程式人生 > 其它 >topo排序

topo排序

對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊<u,v>∈E(G),則u線上性序列中出現在v之前。通常,這樣的線性序列稱為滿足拓撲次序(Topological Order)的序列,簡稱拓撲序列。簡單的說,由某個集合上的一個偏序得到該集合上的一個全序,這個操作稱之為拓撲排序

(摘自百度)

拓撲排序用於解決活動有明顯層級的問題、

- Kahn演算法

<u,v>連邊表示u的層級比v小,記錄每個點的入度,如果點的入度為零則入隊。每次取出隊首元素,刪去其連邊(即in[v]--),如果in[v]=0則入隊,這樣可以保證層級小的全都遍歷完之後才會遍歷下一層級

拓撲排序還可以解決有向環的問題。如果DAG中存在有向環,環中的點不可能入隊,用tot記錄入隊的點的個數,如果tot小於n則圖中存在環

void Toposort(int T){
    queue<int>q;
    for(int i=1;i<=n;++i){
        if(in[i]==0)q.push(i);
    }
    int tot=0;
    while(!q.empty()){
        int x=q.front();q.pop();tot++;
        for(int i=head[x];i;i=e[i].next){
            int v=e[i].to;
            in[v]--;
            if(!in[v])q.push(v);
        }    
    }
    if(tot!=n){
        存在有向環
    }
}