拓撲排序(基於dfs 基於佇列)

2022-06-22 21:36:08 字數 1983 閱讀 1905

dfs函式的返回值表示是否成環,若存在有向環,則不存在拓撲排序。不包含有向環的有向圖稱為有向無環圖(dag)

可以借助dfs完成拓撲排序,在訪問完乙個結點時把他加入當前拓撲序的首部。

舉個栗子:比如乙個(1,2),(1,3),(2,3)的有向無環圖,就先搜尋1,再遞迴搜尋2,再搜尋3,3沒有出度了,於是放進拓撲序尾=,再回到2,2除3外沒有出度,再放入拓撲序,再回到1,1除2,3沒有出度,放入拓撲序

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15

using

namespace

std;

16 typedef long

long

ll;17

#define inf 0x3f3f3f3f

18const ll maxn = 1e3 + 7;19

const ll mod = 1e9 + 7;20

intmp[maxn][maxn];

21int

vis[maxn];

22int topo[maxn], t;//

topo陣列存放最後拓撲排序結果

23int

n,k,m;

24bool dfs(int u)//

判環2534}

35 topo[--k]=u;

36 vis[u]=1;37

return

true;38

}39bool

toposort()

4047

void

print()

4854 cout<

55return;56

}57intmain()

5869

if(toposort())

70print();

71else

72 cout<

sorry to say there is no dag

"/跟題目並沒有關係...73}

74return0;

75 }

view code

加個佇列寫法..

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15

using

namespace

std;

16 typedef long

long

ll;17

#define inf 0x3f3f3f3f

18const ll maxn = 1e3 + 7;19

const ll mod = 1e9 + 7;20

intn, m;

21int

degree[maxn][maxn];

22int

indegree[maxn];

23int

topo[maxn];

24void

toposort()

2545}46

}47return;48

}49void

print()

5057 cout <

58return;59

}60intmain()

61//

處理重邊76}

77toposort();

78print();79}

80return0;

81 }

view code

拓撲排序 dfs

運用dfs,對乙個有向無回圖 dag 進行拓撲排序。乙個圖的拓撲排序可看成所有頂點沿水平線排列而成的乙個序列,使得所有有向邊均從左指向右。topological sort g call dfs g to compute finishing times f v for each vertex v as...

拓撲排序 dfs

include include includeusing namespace std const int maxn 50 typedef struct nodenode typedef struct graphgraph vectorss 存放拓撲序列 bool vis maxn int find ...

拓撲排序(dfs用棧,bfs用佇列)

現在你總共有 n 門課需要選,記為 0 到 n 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...