資料結構 圖的鄰接矩陣
阿新 • • 發佈:2019-01-27
圖的鄰接矩陣的儲存方式是用兩個陣列來實現的,一個一維陣列儲存頂點資訊,一個二維陣列儲存線(無向圖)或弧(有向圖)的資訊。
設圖G有n個頂點,則鄰接矩陣是一個n × n的方陣,定義為:
無向圖的鄰接矩陣,兩個頂點有邊則為1,否則,為0;因為是無向圖arc[i][j] = arc[j][i],所以矩陣為對稱矩陣,對角線為自己到自己的邊,鄰接矩陣中,行之和或者列之和都為各頂點度的總數。
設圖G有是網圖,有n個頂點,則鄰接矩陣是一個n × n的方陣,定義為:
無向網圖和無向圖差不多,就是加了權值,兩個頂點之間無邊的話距離是∞。
如果是有向圖,鄰接矩陣就不是對稱矩陣了。
下面是鄰接矩陣的儲存結構:
#define MAXVERTEX 100 //圖的最大頂點數 #define INFINITY 32767 //用有符號的int最大值表示無窮大 typedef char vertextype; //定義定點的儲存資訊為字元型 typedef int arctype; //定義邊的權值為int型 //圖的鄰接矩陣的儲存結構 typedef struct { vertextype vertex[MAXVERTEX]; //頂點表 arctype arc[MAXVERTEX][MAXVERTEX]; //鄰接矩陣 int vertexnum; //圖的當前頂點數 int arcnum; //圖的當前邊數 }MGraph;
儲存結構裡面主要由四部分構成,
第一部分是一個一維陣列儲存的是頂點資訊,
第二部分是鄰接矩陣由二維陣列組成,儲存著各頂點彼此之間的關係,
第三部分和第四部分分別是當前圖的頂點數和線數。
下面是具體的程式碼實現(註釋的很詳細了):
#include <iostream> using namespace std; #define MAXVERTEX 100 //圖的最大頂點數 #define INFINITY 32767 //用有符號的int最大值表示無窮大 typedef char vertextype; //定義定點的儲存資訊為字元型 typedef int arctype; //定義邊的權值為int型 //圖的鄰接矩陣的儲存結構 typedef struct { vertextype vertex[MAXVERTEX]; //頂點表 arctype arc[MAXVERTEX][MAXVERTEX]; //鄰接矩陣 int vertexnum; //圖的當前頂點數 int arcnum; //圖的當前邊數 }MGraph; //建立無向網 void CreateMGraph(MGraph &G) { cin >> G.vertexnum; //輸入頂點數目 cin >> G.arcnum; //輸入邊數 for(int i = 0; i < G.vertexnum; i++) //輸入頂點資訊 cin >> G.vertex[i]; for(int i = 0; i < G.vertexnum; i++) //將所有邊初始化為無窮大 for(int j = 0; j < G.vertexnum; j++) G.arc[i][j] = INFINITY; for(int k = 0; k < G.arcnum; k++) { int i, j, w; cin >> i >> j; //輸入構成邊的兩個頂點 cin >> w; //輸入邊所對應的權值 G.arc[i][j] = w; G.arc[j][i] = G.arc[i][j]; //無向圖的鄰接矩陣為對稱矩陣 } } //列印鄰接矩陣 void PrintfMGraph(MGraph G) { for(int i = 0; i < G.vertexnum; i++) { for(int j = 0; j < G.vertexnum; j++) cout << G.arc[i][j] << '\t'; cout << endl; } } //主函式 int main() { MGraph G; CreateMGraph(G); PrintfMGraph(G); return 0; }
鄰接矩陣的時間複雜度為O(n + n^2 + e),其中n為頂點數,e為邊數,去掉低階和係數後,變為O(n^2)。
執行結果(根據上面第二個圖輸入的資料):