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 #includeview code8 #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 }
加個佇列寫法..
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #includeview code8 #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 }
拓撲排序 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 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...