C++輸出有向無環圖的所有拓撲序列
1,基本思想
輸出有向無環圖的其中一個拓撲序列比較簡單,輸出所有的拓撲序列則要用到回溯的思想和遞迴的方法。這裡暫不對回溯法做解釋。
2,程式碼實現
#include<iostream>
#include<vector>
using namespace std;
#define Max 9999
vector<int> result; //用來儲存並輸出拓撲結果
int n, m; //n 為頂點數, m 為邊數
int G[Max][Max];
bool visited[Max];
int inDegree[Max]; //記錄各個頂點的入度
void dfs()
{
if (result.size() == n)
{
for (int i = 0; i < n; ++i)
{
cout << result[i] << " ";
}
cout << endl;
return;
}
for (int i = 0; i < n; ++i)
{
if (!visited[i] && inDegree[i] == 0)
{
result.push_back(i);
visited[i] = true;
for (int j = 0; j < n; ++j)
{
if (G[i][j] > 0)
{
inDegree[j]--;
}
}
dfs();
result.pop_back();
visited[i] = false;
for (int j = 0; j < n; ++j)
{
if (G[i][j] > 0)
{
inDegree[j]++;
}
}
}
}
return;
}
int main()
{
cout << "輸入頂點數:";
cin >> n;
cout << "輸入邊數:";
cin >> m;
fill(G[0], G[0] + Max * Max, 0);
fill(visited, visited + Max, false);
fill(inDegree, inDegree + Max, 0);
cout << "輸入各條邊的資訊:";
int u, v; //u為邊的出發點, v為邊的終點
for (int i = 0; i < m; ++i)
{
cin >> u >> v;
G[u][v]++;
inDegree[v]++;
}
dfs();
return 0;
}
輸入輸出資訊:
相關文章
- 拓撲排序 (BFS )DAG (有向無環圖)排序
- 有向圖的拓撲排序——DFS排序
- 圖論——拓撲排序圖論排序
- Reward (圖論+拓撲排序)圖論排序
- 網路拓撲圖:網路拓撲圖介紹及線上製作
- 拓撲排序詳解(梅開二度之dfs版按字典序輸出拓撲路徑+dfs版輸出全部拓撲路徑排序
- 無向圖的最小環問題
- 演算法-圖論-拓撲排序演算法圖論排序
- 團隊拓撲快速參考圖
- vue 實現動態拓撲圖Vue
- 圖的拓撲排序詳解與實現排序
- 無向圖的最小環問題[TODO]
- 拓撲排序排序
- Noc拓撲
- 圖解拓撲排序+程式碼實現圖解排序
- 網路拓撲例項之RRPP單環(五)
- StratoVirt 的 vCPU 拓撲(SMP)
- 拓撲排序,YYDS排序
- 基於d3.js的關係拓撲圖JS
- 樹的拓撲序計數
- 拓撲序的三種功能
- zabbix二次開發整合拓撲圖功能
- 筆記:拓撲排序筆記排序
- 拓撲排序小結排序
- 圖-無向圖
- 商企網路拓撲的搭建
- 最長公共子序列LCS 輸出所有LCS
- 【筆記/模板】拓撲排序筆記排序
- 網路拓撲結構
- DFS實現拓撲排序排序
- AOV網與拓撲排序排序
- POJ 1734 Sightseeing trip Floyd求無向圖最小環
- 基於 HTML5 WebGL 的 3D 網路拓撲圖HTMLWeb3D
- 基於 WebGL 的 HTML5 3D 網路拓撲圖WebHTML3D
- 快速建立 HTML5 Canvas 電信網路拓撲圖HTMLCanvas
- 一道很有趣的拓撲題
- 拓撲排序就這麼回事排序
- tidb拓撲查詢工具qtidbTiDBQT