C++輸出有向無環圖的所有拓撲序列

qq_46027243發表於2020-10-04

輸出有向無環圖的所有拓撲序列

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;
}

輸入輸出資訊:
在這裡插入圖片描述
在這裡插入圖片描述

相關文章