圖的深度優先搜尋(鄰接矩陣實現)
阿新 • • 發佈:2019-02-04
晚上聽了一節同學的計算機軟體選修課,剛好講的圖的相關演算法,今天先實現深度優先搜尋吧。
深度優先搜尋,用我的理解,是先設定一個起始點,然後搜尋其鄰接點,用一個visited陣列儲存該點是否未被訪問,若未被訪問,則作為新的起始點,搜尋其鄰接點,這裡就涉及到遞迴演算法。
存在幾個問題:
- 圖的鄰接矩陣的定義:就是一個二維陣列,陣列下標是邊的兩個端點,若該邊存在,則相應陣列元素置1。
- 利用圖的鄰接矩陣尋找當前起始點的鄰接點,滿足元素值為1且未被訪問。
- 找到下一個鄰接點後需要將visited相應元素置1!!此處需要實現一個遞迴,直到所有點都被訪問後遞迴結束。
完整程式碼如下:
const int MAX_VERTEX_NUM=10;//頂點個數; typedef int VERTYPE; //圖的定義 typedef struct{ VERTYPE vexs[MAX_VERTEX_NUM];//頂點集合 int visited[MAX_VERTEX_NUM]; int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//鄰接矩陣 int vexnum, arcnum;//頂點個數與弧的個數 }mgraph, *MGraph; //圖的初始化 void Init_MGraph(MGraph &g){ g=(MGraph)malloc(sizeof(mgraph)); g->arcnum=g->vexnum=0; for(int i=0;i<MAX_VERTEX_NUM;i++) g->vexs[i]=0; for(int i=0;i<MAX_VERTEX_NUM;i++) g->visited[i]=0; for(int i=0;i<MAX_VERTEX_NUM;i++){ for(int j=0;j<MAX_VERTEX_NUM;j++) g->arcs[i][j]=0; } } //增加頂點 void add_vexs(MGraph &g){ cout<<"請輸入圖的頂點個數:"<<endl; cin>>g->vexnum; //cout<<g->vexnum<<" 333"<<endl; cout<<"請輸入頂點的值:"<<endl; for(int i=0;i<g->vexnum;i++){ cin>>g->vexs[i]; } } //增加邊 void add_arcs(MGraph &g){ cout<<"請輸入邊的個數:"<<endl; cin>>g->arcnum; VERTYPE ch1,ch2; int row, col; cout<<"請輸入每條邊的端點:"<<endl; for(int i=0;i<g->arcnum;i++){ cin>>ch1;//左端點 cin>>ch2;//右端點 for(int j=0;j<g->vexnum;j++){//該邊必須存在於圖中 if(g->vexs[j]==ch1) row=j; if(g->vexs[j]==ch2) col=j; } //cout<<row<<" "<<col<<endl; g->arcs[row][col]=1; g->arcs[col][row]=1; } } void create_MGraph(MGraph &g){ add_vexs(g); add_arcs(g); } void print_MGraph(MGraph g){ cout<<"輸出鄰接矩陣:"<<endl; cout<<" "; for(int i=0;i<g->vexnum;i++){ cout<<" "<<g->vexs[i]; } cout<<endl; for(int i=0;i<g->vexnum;i++){ cout<<g->vexs[i]<<" "; for(int j=0;j<g->vexnum;j++) cout<<g->arcs[i][j]<<" "; cout<<endl; } } void visit(MGraph &g, int i){ cout<<g->vexs[i]<<" "; g->visited[i]=1; } void DFSTraverse(MGraph &g, int i){ visit(g,i); for(int j=0;j<g->vexnum;j++){ if(g->arcs[i][j]&&!g->visited[j]) DFSTraverse(g,j); } return; } int main(){ MGraph g; Init_MGraph(g); create_MGraph(g); print_MGraph(g); cout<<"圖的DFS的遍歷結果為:"<<endl; DFSTraverse(g,0); }
效果如下: