1. 程式人生 > >Java實現拓撲排序:基於鄰接矩陣,針對有向無環圖

Java實現拓撲排序:基於鄰接矩陣,針對有向無環圖

	public void topoSort(){//僅僅針對有向圖,基本思路是找到一個無後繼的結點,將其刪除,並放到排序陣列的尾端,依次迴圈。直到沒有結點。
		int originalVertex = nVertex;
		while(nVertex > 0){		
			int noSucVert = getNoSuccessorVertex();//獲取一個無後繼結點
			if(noSucVert == -1){
				System.out.println("graph have circle");
				return;
			}
			sortArray[nVertex-1] = vertexList[noSucVert];//將待刪除結點複製給排序陣列
			deleteVertex(noSucVert);//刪除無後繼結點
		}
		System.out.println(" topoSort:");
		for(int i=0;i< originalVertex ; i++){
			System.out.print("  "+sortArray[i].vertexName);
		}
	}

	public int getNoSuccessorVertex(){
		boolean isEndVertex = false;
		for(int i=0; i < nVertex; i++){//對每一個頂點
			isEndVertex = false;
			for(int j=0; j< nVertex; j++){//若該結點的固定行,每一列有一個是1,說明該結點有後繼,跳出迴圈
				if(adjMatrix[i][j] == 1){
					isEndVertex = true;
					break;
				}
			}//for
			if(!isEndVertex){//若該結點無後繼,返回該結點的 下標值
				return i;
			}
		}//for
		return -1;
	}

	public void deleteVertex(int vertex){
		if(vertex >= 0 && vertex < nVertex-1){//若頂點值 是最後一個元素,則沒必要進行陣列元素的搬遷,直接nVertex--即可。
			for(int i=vertex; i< nVertex-1 ;i++){//對頂點物件陣列中的該頂點進行刪除;
				vertexList[i] = vertexList[i+1];
			}
			for(int j=vertex; j< nVertex -1 ;j++){//對從第vertex+1 行 開始的元素依次向上平移一行,覆蓋掉vertex行。
				for(int k = 0;k < nVertex -1 ;k++){
					adjMatrix[j][k] = adjMatrix[j+1][k];
				}
			}
			for(int m = vertex;m<nVertex-1 ;m++){//對從第vertex+1 列 開始的元素依次向左平移一行,覆蓋掉vertex列。
				for(int n = 0;n< nVertex-1 ;n++){
					adjMatrix[n][m] = adjMatrix[n][m+1];
				}
			}
		}
		--nVertex;//頂點數減一
	}
class GraphApp{
	public static void main(String args[]){
		Graph g = new Graph(9);
		g.addVertex('A');
		g.addVertex('B');
		g.addVertex('C');
		g.addVertex('D');
		g.addVertex('E');
		g.addVertex('F');
		
		g.addDirEdge(0, 1);
		g.addDirEdge(1, 2);
		g.addDirEdge(1, 4);
		g.addDirEdge(1, 5);
		g.addDirEdge(4, 3);
		
		g.topoSort();
	}
}

輸出:

 topoSort:
  A  B  F  E  D  C



相關推薦

Java實現排序基於鄰接矩陣針對

public void topoSort(){//僅僅針對有向圖,基本思路是找到一個無後繼的結點,將其刪除,並放到排序陣列的尾端,依次迴圈。直到沒有結點。 int originalVertex

演算法 (DAG)的排序

更新: 拓撲排序有2中方法(最後結果可能不同,因為拓撲排序有多解)。 一個簡單的求拓撲排序的演算法是先找出任意一個沒有入邊的頂點,然後將它和它的邊從圖中刪除。然後對剩餘部分使用同樣的操作。 public ArrayList<Integer&g

C#實現(DAG)排序

對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u線上性序列中出現在v之前。通常,這樣的線性序列稱為滿足拓撲次序(Topological Order)的序列,簡稱拓撲序列。簡單的

排序(DFS實現

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

DAG 排序 程式碼解釋

目錄: DAG定義 舉例描述 實際運用 演算法描述 演算法實戰 演算法視覺化 定義 在圖論中,由一個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的一個拓撲排序(英語:Topological sorting)。 每個頂點出現且只出現一

->->排序

文字描述   關於有向無環圖的基礎定義:     一個無環的有向圖稱為有向無環圖,簡稱DAG圖(directed acycline graph)。DAG圖是一類較有向樹更一般的特殊有向圖。        舉個例子說明有向無環圖的應用。假如有一個表示式: ((a+b)*(b*(c+d))+(c+d)*e

建立鄰接深度優先遍歷和廣度優先遍歷的遞迴與非遞迴演算法判斷是否是並輸出一種序列

/*(1)輸入一組頂點,建立有向圖的鄰接表,進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。 (2)根據建立的有向圖,判斷該圖是否是有向無環圖,若是,則輸出其一種拓撲有序序列。*/ #include<stdio.h>

排序(判斷是否是

要進行拓撲排序之前,該圖要是有向無環圖。 排序方法: 1、從有向圖中選取一個沒有前驅的頂點,並輸出之 ;2、從有向圖中刪去此頂點以及所有以它為尾的弧; 3、重複上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點為止。 #include<stdio.h>

排序+(DAG)的檢測

參考: 演算法導論第三版 p356, 資料結構與演算法分析p218, 演算法入門經典p110 拓撲排序的兩張方法: 1.dfs搜尋 2.模擬人工的拓撲 兩種方法的效率都是O(V + E)$$拓撲排序的方法也是有向無環圖檢測的方法 /* 拓撲排序 dfs搜尋 - 鄰接表 可

論】排序

1. 引言 有向無環圖(Directed Acyclic Graph, DAG)是有向圖的一種,字面意思的理解就是圖中沒有環。常常被用來表示事件之間的驅動依賴關係,管理任務之間的排程。拓撲排序是對DAG的頂點進行排序,使得對每一條有向邊(u, v),均有u(在排序記錄中)比v先出現。亦可理解為對某點v而言,只

排序

拓撲排序只能用於無環圖。// 頂點class Vertex3 {    char label;    boolean visited;    public Vertex3(char label) {        this.label = label;        visi

最短路模板(二)——用排序解決中的最短路

測試資料: 8 13 5 4 0.35 4 7 0.37 5 7 0.28 5 1 0.32 4 0 0.38 0 2 0.26 3 7 0.39 1 3 0.29 7 2 0.34 6 2 0.40 3 6 0.52 6 0 0.58 6 4 0.93 測試結果: 5

算法87-----DAG排序

gree 方案 跳過 分享圖片 分享 return tail take != 一、題目:課程排表---210 課程表上有一些課,是必須有修學分的先後順序的,必須要求在上完某些課的情況下才能上下一門。問是否有方案修完所有的課程?如果有的話請返回其中一個符合要求的路徑,否則返

(DAG)的所有序列

如果index>length(S(i)),即index的值如果大於集合S(i)的大小了,說明當前集合S(i)中的值都用過了,必須回溯到前一個序列元素result[i-1],將它的值變成它對應集合(S(i-1))中的下一個可能的值.假設之前result[i-1]使用的是S(i-1)[n],那麼現在resu

(DAG)技術超越區塊鏈的分散式賬本

一、起源 DAG(Directed Acyclic Graph,有向無環圖)是一種資料結構,最早提出在區塊鏈中加入DAG概念作為演算法,是在2013年的bitcointalk論壇,被稱作為“Ghost協議”,這一提議也是為了解決當時比特幣的擴容問題。後來,在NXT社群,

數據結構筆記如何生成隨機

args pri 過程 語言 mage rul 逆向 無環 丟失 在驗證有向無環圖相關的各種算法時需要一些測試數據,手動構造的話太麻煩了,於是便想著能不能自動生成一些測試數據來。查了一下相關資料,這個可以借助拓撲排序的原理來實現,想象一下一個有向無環圖要對其拓撲排序,需要從

DAGNN神經網路

1.綜述: DagNN是用來代替SimpleNN的CNN wrapper。它是面向物件的,並且允許採用有向無環圖構建神經網路。與SimpleNN相比,DagNN速度有點慢但是更加靈活。 一個DAG物件包括以下資料成員: layers: 神經網路層 vars

C語言利用鄰接矩陣的儲存方式實現排序

 C語言利用圖的鄰接矩陣的儲存方式實現拓撲排序 在拓撲排序中,我們的物件是有向無環圖,這種圖是描述工程進行過程的有效工具。比如“課程開課順序,施工程序,軟體開發程序”,我們在使用有向無環圖表示他們的時候,我們往往使用頂點表示這些事件中的一個活動,頂點和頂點之間的有向邊表示一種活動和活動

資料結構(C++)——基於鄰接矩陣實現結構

抽象資料型別 操作介面:圖支援的操作介面分為邊和頂點兩類 Graph模板類 typedef enum { UNDISCOVERED, DISCOVERED, VISITED } VStatus; //頂點狀態 typedef enum { UNDETERMINE

小朋友學資料結構(16)基於鄰接矩陣的的深度優先遍歷和廣度優先遍歷

觀察下面兩個無向圖: 這兩個圖其實是一樣的,只是畫法不同罷了。第一張圖更有立體感,第二張圖更有層次感,並且把A點置為頂點(事實上圖的任何一點都可以做為頂點)。 一、用陣列來存放頂點 vexs[0] = ‘A’ vexs[1] = ‘B’ vexs[2] = ‘C’ ve