資料結構 基於深度優先遍歷演算法的應用

2021-07-13 06:07:49 字數 3182 閱讀 8347

/*

基於深度優先遍歷演算法的應用。

假設圖g採用鄰接矩陣儲存:

(1)判斷圖g中從頂點u到v是否存在簡單路徑;

(2)輸出圖g中從頂點u到v的一條簡單路徑(假設至少存在一條路徑);

(3)輸出從圖g中從頂點u到v的所有簡單路徑(假設至少存在一條路徑);

(4)輸出從圖g中從頂點u到v的長度為s的所有簡單路徑;

(5)求圖中通過某頂點k的所有簡單迴路(若存在)。

*/#include #include #include #define maxv 50

using namespace std;

int visited[maxv];

//鄰接表型別

typedef struct anode

arcnode; //邊節點的型別

typedef struct vnode

vnode; //鄰接表頭節點型別

typedef vnode adjlist[maxv];

typedef struct

algraph; //完整的圖鄰接表型別

void arraytolist(int *arr, int n, algraph *&g) //用普通陣列構造圖的鄰接表

g->e=count;

}void dispadj(algraph *g) //輸出鄰接表g

printf("\n");

}}/*

判斷圖g中從頂點u到v是否存在簡單路徑:

在深度優先遍歷的基礎上增加has和v兩個形參,其中has表示頂點u到v是否有路徑,其初值為false,

當頂點u遍歷到頂點v後,置has為true並返回。

*/void existpath(algraph *g,int u,int v,bool &has)

p=g->adjlist[u].firstarc; //p指向頂點u的第乙個鄰接點

while(p!=null)

}/*輸出圖g中從頂點u到v的一條簡單路徑:

在深度優先遍歷的基礎上增加v、path和d三個形參,其中path存放頂點u到v的路徑,d表示path中的路徑長度,初值為-1

當頂點u遍歷到頂點v後,輸出path並返回。

*/void findapath(algraph *g,int u,int v,int path,int d)}/*

輸出從圖g中從頂點u到v的所有簡單路徑:

在深度優先遍歷的基礎上增加v、path和d三個形參,其中path存放頂點u到v的路徑,d表示path中的路徑長度,初值為-1

當從頂點u出發遍歷時,先將visited[u]置為1,並將u加入到路徑path中,若滿足頂點u就是終點的v的條件時,

則找到了乙個從頂點u到v的一條路徑,則輸出path並繼續;再從頂點u找乙個未訪問過的相鄰頂點w,若存在這樣的頂點w,

則從w出發繼續進行,若不存在這樣的頂點w,則說明從頂點u再往下找找不到路徑,所以置visited[u]為0,以便頂點u作為

其他路徑上的頂點。

*/void findpath(algraph *g,int u,int v,int path,int d)

visited[u]=0; //恢復環境,使該頂點可重新使用}/*

輸出從圖g中從頂點u到v的長度為s的所有簡單路徑;

只需將路徑輸出條件改為u==v且d==s。

*/void pathall(algraph *g,int u,int v,int s,int path,int d)

visited[u]=0; //恢復環境,使該頂點可重新使用}/*

求圖中通過某頂點k的所有簡單迴路(若存在):

利用深度優先搜尋方法,從頂點u開始搜尋與之相鄰的頂點w,若w等於頂點v(其初值為u),且路徑長度大於0,表示找到了一條迴路,

*/void dfspath(algraph *g,int u,int v,int path,int d)

visited[u]=0; //恢復環境,使該頂點可重新使用

}int main()

, ,,,

};int b[5][5]=,,

,,};int c[5][5]=,,

,,};arraytolist(a[0], 5, g);

arraytolist(b[0], 5, g1);

arraytolist(c[0], 5, g2);

for (i=0; in; i++)

visited[i]=0; //訪問標誌陣列初始化

printf("有向圖g的鄰接表:\n");

dispadj(g);

cout

visited[i]=0; //訪問標誌陣列初始化

existpath(g,1,4,f);

cout<

if(f)

cout<

visited[i]=0; //訪問標誌陣列初始化

cout

visited[i]=0; //訪問標誌陣列初始化

printf("無向圖g1的鄰接表:\n");

dispadj(g1);

cout

visited[i]=0; //訪問標誌陣列初始化

printf("輸出g1從1到4的所有簡單路徑:\n");

findpath(g1,1,4,path,-1);

cout

visited[i]=0; //訪問標誌陣列初始化

cout<

pathall(g1,1,4,3,path,-1);

cout

visited[i]=0; //訪問標誌陣列初始化

printf("有向圖g2的鄰接表:\n");

dispadj(g2);

cout

visited[i]=0; //訪問標誌陣列初始化

cout<

dfspath(g2,0,0,path,-1);

cout執行結果:

資料結構之深度優先遍歷

深度優先遍歷 從根節點開始遍歷,從左到右依次遍歷,遍歷時應先將一條分支上遍歷完才進行下一輪遍歷。如圖 遍歷順序為 1 2 4 3 5 程式如下 include int book 101 用於標記是否已遍歷過,未遍歷則為值為0 int sum 每標記一次加 1 直到sum等於需要遍歷的頂點個數n為止 ...

C 深度優先遍歷結構演算法

今天有個朋友問到深度遍歷圖這樣的問題,開始都不知道如何下手,就問了問baidu 和 google,看到有人用c 寫的這樣的例子,順便就學習了一下,發現自己都忘得差不多了 包括 資料結構 只能聯想到剛開始學vs2003的時候,學習的第乙個hello worl的例子,要建立乙個控制台應用程式。文 zha...

C 深度優先遍歷結構演算法

n久都沒做過關於c 的winform程式了,一直都是在研究asp.net的程式。今天有個朋友問到深度遍歷圖這樣的問題,開始都不知道如何下手,就問了問baidu 和 google,看到有人用c 寫的這樣的例子,順便就學習了一下,發現自己都忘得差不多了 包括 資料結構 只能聯想到剛開始學vs2003的時...