1. 程式人生 > >圖的深度優先搜尋(鄰接矩陣實現)

圖的深度優先搜尋(鄰接矩陣實現)

晚上聽了一節同學的計算機軟體選修課,剛好講的圖的相關演算法,今天先實現深度優先搜尋吧。
深度優先搜尋,用我的理解,是先設定一個起始點,然後搜尋其鄰接點,用一個visited陣列儲存該點是否未被訪問,若未被訪問,則作為新的起始點,搜尋其鄰接點,這裡就涉及到遞迴演算法。
存在幾個問題:

  1. 圖的鄰接矩陣的定義:就是一個二維陣列,陣列下標是邊的兩個端點,若該邊存在,則相應陣列元素置1。
  2. 利用圖的鄰接矩陣尋找當前起始點的鄰接點,滿足元素值為1且未被訪問。
  3. 找到下一個鄰接點後需要將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);
}

效果如下:
在這裡插入圖片描述