拓撲排序 Kahn演算法

2021-08-04 05:01:14 字數 652 閱讀 2578

該演算法的關鍵在於需要維護乙個入度為0的頂點的集合:

每次從該集合中取出

(如果要求輸出時編號小的在前,可以用優先佇列儲存集合

)乙個頂點,將該頂點放入儲存結果的

list中。

緊接著迴圈遍歷由該頂點引出的所有邊,從圖中移除這條邊,同時獲取該邊的另外乙個頂點,如果該頂點的入度在減去本條邊之後為0,那麼也將這個頂點放到入度為0的集合中。然後繼續從集合中取出乙個頂點…………

當集合為空之後,檢查圖中是否還存在任何邊,如果存在的話,說明圖中至少存在一條環路。不存在的話則返回結果list,此list中的順序就是對圖進行拓撲排序的結果。)

**:

#include#include#include#include#include#define inf 1<<29

using namespace std;

int in[510],n,m;

bool vis[510];

vectorvec[510];

void bfs()

}int flag=0;

while(!q.empty())}}

printf("\n");

}int main()

bfs();

}return 0;

}

Kahn演算法拓撲排序

1.概念及規則 規則 圖中每個頂點只出現一次。a在b前面,則不存在b在a前面的路徑。否則就會形成環 頂點的順序是 保證所有指向它的下個節點在被指節點前面 2.演算法及實現 kahn演算法 include using namespace std csont int maxn 10005 struct ...

拓撲排序 kahn演算法及dfs的拓撲排序

有個人的家族很大,輩分關係很混亂,請你幫整理一下這種關係。給出每個人的孩子的資訊。輸出乙個序列,使得每個人的後輩都比那個人後列出 sample input 5 0 4 5 1 0 1 0 5 3 0 3 0樣例輸出 sample output 2 4 5 3 1 因為需輸出字典序最小的因而要使用優先...

HDU 1258 拓撲排序Kahn演算法

問題概述 有n個比賽隊,編號為從1到n,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在 裁 判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2 用p1 p2表示 這種,排名時p1在 必 須在p2之前,現在請你程式設計序確定排名 答案不止一種,按照隊伍從小到大排列...