對於圖的構造我們有三種方法,第一種鄰接矩陣,第二種鄰接表,第三種十字鏈表。在這里我們深度解析 鄰接矩陣與鄰接表 的構造方法!
首先我們闡述第一種方法: 鄰接矩陣 (鄰接矩陣用於相對來說比較稠密的無向圖)
例如此無向圖:
相對應的鄰接矩陣表示如下:
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 }