**鄰接矩陣對於無向圖的理解


對於圖的構造我們有三種方法,第一種鄰接矩陣,第二種鄰接表,第三種十字鏈表。在這里我們深度解析 鄰接矩陣與鄰接表 的構造方法!

首先我們闡述第一種方法: 鄰接矩陣 (鄰接矩陣用於相對來說比較稠密的無向圖)

例如此無向圖:

相對應的鄰接矩陣表示如下:

 

  1 #include<iostream>
  3 #include<string>
  5 #define maxSize 10
  7 using namespace  std;
  9 //在此聲明 不用template 模板
 11 class Graph{
 13 public:
 15 Graph(string str[],int vertex,int arc1);
 17 ~Graph(){
 19 //由於沒有動態申請內存 無法對改內存進行釋放(在此處做聲明)
 21 cout<<"析構函數調用成功!";
 23 };
 25 void DFS(int v); //深度優先遍歷
 27 void FdgDFS(int v); //非遞歸的深度優先遍歷
 29 void BFS(int v); //廣度優先遍歷 
 31 private:
 33 int verNum;
 35 int arcNum;
 37 string verName[maxSize];
 39 //對於鄰接矩陣構造無向圖肯定少不了鄰接矩陣 即二維數組
 41 int arc[maxSize][maxSize];
 43 //遍歷時,對於沒有訪問過的頂點,需要建立flag 標識
 45 int visited[maxSize]={0};
 47 };
 49 Graph::Graph(string str[],int vertex,int arc1){
 51  verNum=vertex;
 53 //頂點的賦值
 55 for(int i=0;i<verNum;i++){
 57 verName[i]=str[i];
 59 }
 61 for(int i=0;i<verNum;i++)  //初始化鄰接矩陣
 63   for(int j=0;j<verNum;j++)
 65     arc[i][j]=arc[j][i]=0;
 67 //對邊進行構造 輸入依附於邊的鄰接點的下標
 69 arcNum=arc1;
 71 for(int k=0;k<arcNum;k++){
 73   int i=0;
 75   int j=0;
 77   cout<<"請輸入依附於邊的鄰接點下標 "<<endl;
 79   cin>>i>>j;
 81   //無向圖的鄰接矩陣是對稱的 
 83   arc[i][j]=arc[j][i]=1; 
 85  }
 87 }
 89 //遞歸的深度遍歷
 91 void Graph::DFS(int v){
 93  cout<<verName[v];
 95  visited[v]=1;
 97  for(int j=0;j<verNum;j++){
 99  if(arc[v][j]==1 && visited[j]==0)
101   DFS(j);
103   }
105 }
107 //非遞歸的深度優先遍歷
109 void Graph::FdgDFS(int v){
111  int Stack[maxSize];
113  int top=-1;
115  cout<<verName[v];
117  visited[v]=1;
119  Stack[++top]=v;
121  while(top!=-1){
123  v=Stack[top];
125  for(int j=0;j<verNum;j++){
127   if(arc[v][j]==1 && visited[j]==0){
129   cout<<verName[j];
131   visited[j]=1;
133  Stack[++top]=j;
135  break;
137  } 
139  if(j==verNum-1)
141  top--;
143   } 
145  }
147 }
149 //廣度優先遍歷
151 void Graph::BFS(int v){
153  //定義隊列進行遍歷
155  int Queue[maxSize];
157  int front=-1;
159  int rear=-1;
161  cout<<verName[v];
163  visited[v]=1;
165  Queue[++rear]=v;
167  while(front!=rear){
169  //出隊
171  v=Queue[++front];
173  for(int j=0;j<verNum;j++)
175  if(arc[v][j]==1 && visited[j]==0){
177  cout<<verName[j];
179  visited[j]=1;
181  //入隊
183  Queue[++rear]=j;
185     }
187   }
189 }
193 int main(){ 
195  string mystr[4]={"v0","v1","v2","v3"};
197  Graph myGraph(mystr,4,4);
199  //深度優先遍歷
201  myGraph.DFS(2);
203  //非遞歸深度優先遍歷
205  myGraph.FdgDFS(2);
207  //廣度優先遍歷
209  myGraph.BFS(2);
211  return 0;
213 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM