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