在有向圖中,對所有節點進行排序,要求沒有乙個節點指向它前面的乙個節點,這樣的序列稱為拓撲序。
統計節點入度,每次取出當前入度為0的點,將其與其相連的邊刪除,重複執行。
當某一時刻找不到入度為0的點,要麼已經找完了所有節點,要麼是有環無解。
\(code:\)
queueq;
vectorans;
void topsort()}}
if(ans.size()==n)
printf("\n");
}else printf("-1");//有環無解
}
注意:有些情況下可能會有多個拓撲序,當題目要求字典序最小時,將佇列換成優先佇列即可。
拓撲排序是對有向圖節點進行排序的演算法,其限制是對於序列中任意元素,前面都沒有被它所指向的點。
舉個例子:
商店有\(n\)個物品,但其中購買一些物品需要先購買其他的物品才能解鎖購買,求乙個合法購買方案。
將有前提條件的商品向所限制商品連邊,例如:購買1號商品得先購買2,3號商品,所以將1號商品向2,3號商品連邊,若出現了環,則互相約束,無解,然後跑一遍拓撲排序就行了。
拓撲排序學習筆記
1.拓撲排序只對於有向無環圖而言 directed acyclic graph簡稱dag 2.在乙個有向無環圖中,若a b c,則拓撲序列為 a,b,c 也就是說如果一條邊a b,那麼在拓撲序列裡a就在b前面 知道了這兩點,那麼就可以來求拓撲序列了 首先,我們知道在dag中一定存在乙個入度為0的點,...
拓撲排序學習筆記
1.輸出字典序最小的拓撲序 在bfs演算法方法中用優先佇列 2.題意 n個點m條邊 dag 求刪去每個點後1 n最短路 n,m 3e5 做法 首先在dag中可以跑拓撲排序,跑完拓撲排序有什麼好處呢?拓撲序上的乙個點k作為劃分線,前半段的點的集合設為x,後半段點的集合設為y,那麼從點1到x中的任意乙個...
學習筆記 拓撲排序
有向圖的拓撲序列 給定乙個n個點m條邊的有向圖,點的編號是1到n,圖中可能存在重邊和自環。請輸出任意乙個該有向圖的拓撲序列,如果拓撲序列不存在,則輸出 1。若乙個由圖中所有點構成的序列a滿足 對於圖中的每條邊 x,y x在a中都出現在y之前,則稱a是該圖的乙個拓撲序列。輸入格式 第一行包含兩個整數n...