邻接矩阵实现(有向邻接矩阵)、(无向邻接矩阵) 基于C++
鄰接矩陣
鄰接表的實現請看這里
圖的鄰接矩陣存儲方式是用兩個數組來表示圖。一個一維數組存儲圖中頂點信息,一個二維數組(鄰接矩陣)存儲圖中的邊或弧的信息。
設圖G有n個頂點,則鄰接矩陣是一個nn的方陣,定義為:
看一個實例,下圖左就是一個無向圖。
從上面可以看出,無向圖的邊數組是一個對稱矩陣。所謂對稱矩陣就是n階矩陣的元滿足aij = aji。即從矩陣的左上角到右下角的主對角線為軸,右上角的元和左下角相對應的元全都是相等的。
從這個矩陣中,很容易知道圖中的信息。
(1)要判斷任意兩頂點是否有邊無邊就很容易了;
(2)要知道某個頂點的度,其實就是這個頂點vi在鄰接矩陣中第i行或(第i列)的元素之和;
(3)求頂點vi的所有鄰接點就是將矩陣中第i行元素掃描一遍,arc[i][j]為1就是鄰接點;
而有向圖講究入度和出度,頂點vi的入度為1,正好是第i列各數之和。頂點vi的出度為2,即第i行的各數之和。
若圖G是網圖,有n個頂點,則鄰接矩陣是一個nn的方陣,定義為:
鄰接表和鄰接矩陣的區別:
對于一個具有n個頂點e條邊的無向圖
它的鄰接表表示有n個頂點表結點2e個邊表結點
對于一個具有n個頂點e條邊的有向圖
它的鄰接表表示有n個頂點表結點e個邊表結點
如果圖中邊的數目遠遠小于n^2稱作稀疏圖,這是用鄰接表表示比用鄰接矩陣表示節省空間
如果圖中邊的數目接近于n^2,對于無向圖接近于n*(n-1)稱作稠密圖,考慮到鄰接表中要附加鏈域,采用鄰接矩陣表示法為宜
鄰接矩陣(有向鄰接矩陣圖)的代碼實現(C++):
/*鄰接矩陣圖@author lph*/#include <iomanip> #include <iostream> #include <vector> using namespace std;constexpr auto MAX = 100; class MatrixDG {private:char mVexs[MAX]; // 頂點集合int mVexNum; // 頂點數int mEdgNum; // 邊數int mMatrix[MAX][MAX]; // 鄰接矩陣public:// 創建圖(自己輸入數據)MatrixDG();// 創建圖(用已提供的矩陣)MatrixDG(char vexs[], int vlen, char edges[][2], int elen);~MatrixDG();// 打印矩陣隊列圖void print();private:// 讀取一個輸入字符char readChar();// 返回ch在mMatrix矩陣中的位置int getPosition(char ch); };/*創建圖(自己輸入數據) */ MatrixDG::MatrixDG() {char c1, c2;int i, p1, p2;// 輸入頂點數和邊數cout << "input vertex number: ";cin >> mVexNum;cout << "input edge number: ";cin >> mEdgNum;if (mVexNum < 1 || mEdgNum < 1 || (mEdgNum > (mVexNum * (mVexNum - 1)))) {cout << "input error: invalid parameters!" << endl;return;}// 初始化頂點for (i = 0; i < mVexNum; ++i) {cout << "vertex(" << i << "):";mVexs[i] = readChar();}// 初始化邊// 先把所有起始頂點到其他頂點的邊初始化為0for (i = 0; i < mVexNum; i++){for (int j = 0; j < mVexNum; ++j)mMatrix[i][j] = 0;}for (i = 0; i < mEdgNum; ++i) {// 讀取邊的起始頂點和結束頂點cout << "edge(" << i << "):";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);if (p1 == -1 || p2 == -1) {cout << "input error: invalid edge!" << endl;return;}mMatrix[p1][p2] = 1;} }/*創建圖(用已經有的矩陣)參數說明:vexs -- 頂點數組vlen -- 頂點數組的長度edges -- 邊數組elen -- 邊數組的長度 */ MatrixDG::MatrixDG(char vexs[], int vlen, char edges[][2], int elen) {int i, p1, p2;// 初始化頂點數和邊數mVexNum = vlen;mEdgNum = elen;// 初始化頂點for (i = 0; i < mVexNum; ++i) mVexs[i] = vexs[i];// 初始化邊// 先把所有起始頂點到其他頂點的邊初始化為0for (i = 0; i < mVexNum; i++){for (int j = 0; j < mVexNum; ++j)mMatrix[i][j] = 0;}for (i = 0; i < mEdgNum; ++i) {// 讀取邊的起始頂點和結束頂點p1 = getPosition(edges[i][0]);p2 = getPosition(edges[i][1]);mMatrix[p1][p2] = 1;} } /*析構函數 */ MatrixDG::~MatrixDG() {} /*返回ch在mMatrix矩陣中的位置 */ int MatrixDG::getPosition(char ch) {int i;for (i = 0; i < mVexNum; ++i) if (mVexs[i] == ch)return i;return -1;} /*讀取一個輸入字符 */ char MatrixDG::readChar() {char ch;do {cin >> ch;} while (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')));return ch; } /*打印矩陣隊列圖 */ void MatrixDG::print() {int i, j;cout << "Matrix Graph:" << endl;for (i = 0; i < mVexNum; ++i) {for (j = 0; j < mVexNum; ++j)cout << mMatrix[i][j] << " ";cout << endl;} } int main() {char vexs[] = { 'A', 'B', 'C', 'D', 'E', 'D', 'F', 'G' };char edges[][2] = {{'A', 'B'},{'B', 'C'},{'B', 'E'},{'B', 'F'},{'C', 'E'},{'D', 'C'},{'E', 'B'},{'E', 'D'},{'F', 'G'}};int vlen = sizeof(vexs) / sizeof(vexs[0]);int elen = sizeof(edges) / sizeof(edges[0]);MatrixDG* pG;// 自定義圖(輸入矩陣隊列)//pG = new MatrixDG();// 采用已經有的數據pG = new MatrixDG(vexs, vlen, edges, elen);// 打印結果pG->print();return 0; }?打印結果(有向鄰接矩陣圖):
自己輸入的數據打印結果(有向鄰接矩陣圖):
?鄰接矩陣(無向鄰接矩陣圖)的代碼實現(C++):
/*** C++: 鄰接矩陣表示的"無向圖(Adjacency Matrix in Undirected Graph)"** @author lph* */#include <iomanip> #include <iostream> #include <vector> using namespace std;constexpr auto MAX = 100; class MatrixUDG { private:char mVexs[MAX]; // 頂點集合int mVexNum; // 頂點數int mEdgNum; // 邊數int mMatrix[MAX][MAX]; // 鄰接矩陣 public:// 創建圖(自己輸入數據)MatrixUDG();// 創建圖(用已經提供的數據)MatrixUDG(char vexs[], int vlen, char edges[][2], int elen);// 析構函數~MatrixUDG();// 打印矩陣void print(); private:// 讀取一個輸入字符char readChar();// 返回ch在mMatrix矩陣中位置int getPosition(char ch); };/*創建圖(自己輸入數據) */ MatrixUDG::MatrixUDG() {char c1, c2;int i,j, p1, p2;// 輸入頂點數和邊數cout << " input vertex number:";cin >> mVexNum;cout << " input edge number: ";cin >> mEdgNum;if (mVexNum < 1 || mEdgNum < 1 || (mEdgNum > (mVexNum * (mVexNum - 1)))) {cout << "input error: invalid parameters!" << endl;return;}// 初始化頂點for (i = 0; i < mVexNum; ++i) {cout << "vertex(" << i << "):";mVexs[i] = readChar();}// 初始化邊// 先把所有起始頂點到其他頂點的邊初始化為0for (i = 0; i < mVexNum; i++)for (j = 0; j < mVexNum; ++j)mMatrix[i][j] = 0;for (i = 0; i < mEdgNum; ++i) {// 讀取邊的起始頂點和結束頂點cout << "edge(" << i << "):";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);if (p1 == -1 || p2 == -1) {cout << "input error: invalid edge!" << endl;return;}mMatrix[p1][p2] = 1;mMatrix[p2][p1] = 1; //無向圖} } /*創建圖(用已經提供的數據)vexs -- 頂點數組vlen -- 頂點數組的長度edges -- 邊數組elen -- 邊數組的長度 */ MatrixUDG::MatrixUDG(char vexs[], int vlen, char edges[][2], int elen) {int i, j, p1, p2;// 初始化頂點數和邊數mVexNum = vlen;mEdgNum = elen;// 初始化頂點for (i = 0; i < mVexNum; ++i)mVexs[i] = vexs[i];// 初始化邊// 先把所有起始頂點到其他頂點的邊初始化為0for (i = 0; i < mVexNum; i++)for (int j = 0; j < mVexNum; ++j)mMatrix[i][j] = 0;for (i = 0; i < mEdgNum; ++i) {p1 = getPosition(edges[i][0]);p2 = getPosition(edges[i][1]);mMatrix[p1][p2] = 1;mMatrix[p2][p1] = 1;} } /** 析構函數*/ MatrixUDG::~MatrixUDG(){} /** 返回ch在mMatrix矩陣中的位置*/ int MatrixUDG::getPosition(char ch) {int i;for (i = 0; i < mVexNum; ++i)if (mVexs[i] == ch)return i;return -1; } /*讀取一個輸入字符 */ char MatrixUDG::readChar() {char ch;do {cin >> ch;} while (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')));return ch; } /** 打印矩陣隊列圖*/ void MatrixUDG::print(){int i, j;cout << "Martix Graph:" << endl;for (i = 0; i < mVexNum; i++){for (j = 0; j < mVexNum; j++)cout << mMatrix[i][j] << " ";cout << endl;} } int main(){char vexs[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };char edges[][2] = {{'A', 'C'},{'A', 'D'},{'A', 'F'},{'B', 'C'},{'C', 'D'},{'E', 'G'},{'F', 'G'} };int vlen = sizeof(vexs) / sizeof(vexs[0]);int elen = sizeof(edges) / sizeof(edges[0]);MatrixUDG* pG;// 自定義"圖"(輸入矩陣隊列)//pG = new MatrixUDG();// 采用已有的"圖"pG = new MatrixUDG(vexs, vlen, edges, elen);pG->print(); // 打印圖return 0; }?打印結果(無向鄰接矩陣圖):
自己輸入的數據打印結果(無向鄰接矩陣圖):
?
鄰接表的實現請看這里
總結
以上是生活随笔為你收集整理的邻接矩阵实现(有向邻接矩阵)、(无向邻接矩阵) 基于C++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql索引类型分析
- 下一篇: c11标准的c语言编译器,官宣:MSVC