1. 程式人生 > >[資料結構]Graph之拓撲排序BFS&DFS實現

[資料結構]Graph之拓撲排序BFS&DFS實現

什麼是拓撲排序在這裡就不說了。直接講講拓撲排序的DFS和BFS實現演算法。

一、DFS實現拓撲排序

演算法描述:遞迴實現

利用了一個輔助函式實現遞迴,下面先對這個輔助函式進行分析:

base case:當所有的“鄰居”點都被訪問過後結束遞迴,並將當前節點加入到佇列的0號位置

general case:如果存在未被訪問的“鄰居”節點,則對其進行訪問(遞迴)

實現程式碼:

template<int max_size>
void Graph<max_size>::DFS(List<Vertex>& output) const
{
	output.clear();
	bool visited[max_size];
	for (int i = 0; i < max_size; i++)
		visited[i] = false;
	for (Vertex v = 0; v < count; v++) {	//防止出現聯通分支
		if (!visited[v])
			recursive_DFS(v, visited, output);	//進入遞迴
	}
}
template<int max_size>
void Graph<max_size>::recursive_DFS(Vertex v, bool * visited, List<Vertex>& output) const
{
	visited[v] = true;
	for (int i = 0; i < neighbours[v].size(); i++) {
		Vertex w;
		neighbours[v].retrieve(i, w);
		if (!visited[w])recursive_DFS(w, visited, output);
	}
	output.insert(0, v);
}


二、BFS實現拓撲排序

演算法描述:利用輔助佇列實現

1)遍歷整個圖,計算每個節點的入度

2)找出入度為0的點,入隊

3)取出佇列中的第一個節點,存入結果連結串列中,並將其“鄰居”節點入度--

4)重複3)直至佇列為空

演算法結束。

實現程式碼:

template<int max_size>
void Graph<max_size>::BFS(List<Vertex>& output) const
{
	output.clear();
	int in_degree[max_size];
	//入度置零
	for (int i = 0; i < max_size; i++)
		in_degree[i] = 0;

	//1)計算初始入度:
	for (Vertex v = 0; v < count; v++) {
		Vertex w;
		for (int i = 0; i < neighbours[v].size(); i++) {
			neighbours[v].retrieve(i, w);
			in_degree[w]++;
		}
	}

	queue<Vertex> wait;
	for (Vertex v = 0; v < count; v++)		//2)第一輪度數為0的點入隊
		if (in_degree[v] == 0)wait.push(v);
	while (!wait.empty()) {
		Vertex x = wait.front();
		output.insert(output.size(), x);	//3)取出隊首放入output
		Vertex w;
		for (int i = 0; i < neighbours[x].size(); i++) {//4)“鄰居”節點入度--
			neighbours[x].retrieve(i, w);
			in_degree[w]--;
			if (in_degree[w] == 0)wait.push(w);
		}
		wait.pop();
	}
}

附測試資料:


相關推薦

[資料結構]Graph排序BFS&DFS實現

什麼是拓撲排序在這裡就不說了。直接講講拓撲排序的DFS和BFS實現演算法。 一、DFS實現拓撲排序 演算法描述:遞迴實現 利用了一個輔助函式實現遞迴,下面先對這個輔助函式進行分析: base case:當所有的“鄰居”點都被訪問過後結束遞迴,並將當前節點加入到佇列的0號位

資料結構基礎:排序

對一個有向無環圖G進行拓撲排序,是將G中所有的頂點排成一個線性序列,使得圖中任意一對頂點u和v,若<u,v>屬於E(G),則u線上性序列中出現在v之前。 方法: 1. 在有向圖中選取一個沒有前驅的頂點輸出值 2. 從圖中刪除該頂點和所有以它為尾的弧 3.

資料結構作業16—排序與關鍵路徑(選擇題)

2-1已知有向圖G=(V, E),其中V = {v1, v2, v3, v4, v5, v6},E = {<v1,v2>, <v1,v4>, <v2,v6>, <v3,v1>, <v3,v4>, <v4,v5>, <

有向無環圖的排序DFS實現

1.有向無環圖的拓撲排序 // enDegree表示每個頂點的入度,這個資料結構可以從圖的結構求出來 // graph是一個二維陣列,但是這個陣列不是圖的鄰接矩陣,graph[i][j]表示依賴於i的第

資料結構排序和關鍵路徑

拓撲排序 在一個表示工程的有向圖中,用頂點表示活動,用弧表示活動之間的優先關係,這樣的有向圖為頂點表示活動的網,稱為AOV網。 基本思路:從AOV網中選擇一個入度為0的頂點輸出,然後刪去此頂點,並刪除以此頂點為尾的弧,繼續重複此步驟,直到輸出全部頂點或者AOV網中不存在入度為0的頂

資料結構與演算法------排序與關鍵路徑

一.拓撲排序 這裡請結合參考部落格學習(在後面) 拓撲排序(無環圖的應用) 在一個表示工程的有向圖中,有頂點表示活動,用弧表示活動之間的優先關係,這樣的有向圖為頂點表示活動的網,我們稱為AOV(Activity On Vertex)網。 AOV網中的弧表示活動之間存在的某種制約關

資料結構——圖(9)——排序DFS

DAG圖與AOV網 一個無環的有向圖稱為有向無環圖(DAG)。圖的頂點可以表示要執行的任務,並且邊可以表示一個任務必須在另一個之前執行的約束; 在這個應用程式中,拓撲排序只是任務的有效序列。 當且僅當圖形沒有有向迴圈時,即如果它是有向無環圖(DAG),則可以進行拓撲排序。 任何DAG

【Python排序搜尋基本演算法】排序

   拓撲排序是對有向無環圖的一種排序,滿足如下兩個條件: 1.每個頂點出現且只出現一次; 2.若A在序列中排在B的前面,則在圖中不存在從B到A的路徑。 如上的無環有向圖,v表示頂點:v=['a','b','c','d','e'],e表示有向邊:e=[('a

資料結構系列希爾排序詳解

基於插入排序的希爾排序Java實現 1、先要搞清楚插入排序的原理 public void InsertSort(int data[]){ //插入排序(升序) int temp; int i,j; for(i=1;i<data.length;i++)

D. Almost Acyclic Graph排序判環】

D. Almost Acyclic Graph time limit per test 1 second memory limit per test 256 megabytes

排序 bfs實現

 程式碼如下: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> #in

TopSort(排序)中DFSBFS的應用

深度優先搜尋: 下面圖中的數字顯示了深度優先搜尋頂點被訪問的順序。 為了實現深度優先搜尋,首先選擇一個起始頂點並需要遵守三個規則: (1) 如果可能,訪問一個鄰接的未訪問頂點,標記它,並把它放入棧中。 (2) 當不能執行規則1時,如果棧不空,就從棧中彈出一個頂點。 (3) 如果不能執行規則1

Almost Acyclic Graph排序

D. Almost Acyclic Graph time limit per test 1 second memory limit per test 256 megabytes input standard input output standard outp

演算法8-10:最短路徑演算法排序

該演算法的基本思想就是按照拓撲排序的順序依次將每個頂點加入到最短路徑樹中,每次加入時將該頂點延伸出的所有頂點進行“放鬆”操作。這種演算法的複雜度是E+V。 程式碼 這種演算法的程式碼比Dijkstra還要簡單,程式碼如下: public class Topology

判斷有向圖是否有環排序-LeetCode 207. Course Schedule

拓撲排序:對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u線上性序列中出現在v之前。 下圖是一個拓撲排序: 下圖不是一個拓撲排序:如何獲得

CodeForces 915D Almost Acyclic Graph排序

D. Almost Acyclic Graph time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard

[資料結構]Graph入度與出度計算

//同上一篇,這裡的圖採用的是鄰接表儲存 //做了一點修改,改成和課本上儲存相同的結構了,也就是說連結串列裡的資料存放的都是與之相鄰的點(不包含該點) template<int max_si

經典演算法排序

定義: 把AOV網(用定點表示活動,用弧表示活動間優先關係的有向圖)絡中各個頂點按照它們互相之間的優先關係排列成一個線性序列的過程叫做拓撲排序。 方法: 在有向圖中選一個沒有前驅的頂點並且輸出 從圖中刪除該頂點和所有以它為尾的弧,即刪除所有與它有關的邊。 重複上述兩

資料結構練習用棧來遞迴實現5的階乘#C語言實現

剛學資料結構,給大家分享一下今天學習資料結構的棧中的一個練習 也算是順便記錄一下學習過程 #include <stdio.h> typedef struct StackNode { int vn; //儲存n的值 int vf; //儲存fun(n)的值 int t

排序(深搜實現)

這裡給大家介紹另外一種拓撲排序,這種是基於深搜實現的。 上圖: 如果我們按照節點編號順序從節點0開始深度優先搜尋,就會得到下面這個序列。 5,6,3,2,8,7,0,4,1 把這個序列逆置一下,就會發現這是一個正確的拓撲序列。(可以好好想一下這個結論,我當時想了很久) 1,4,0,