/*
基於深度優先遍歷演算法的應用。
假設圖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的時...