topo排序
阿新 • • 發佈:2022-05-13
對一個有向無環圖(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){ 存在有向環 } }