C++圖論演算法——圖的儲存方式
- 2021 年 3 月 7 日
- 筆記
使用二維數組鄰接矩陣儲存圖
無向圖:
圖G
定義圖G[101][101],G[i][j]的值表示從結點vi到vj是否有邊或弧,若有,取值為1或權值,若無,則取值為0或∞。以下是圖G用鄰接矩陣表示的列表:
| 結點 | A | B | C | D |
| A | 0 | 1 | 1 | 1 |
| B | 1 | 0 | 0 | 1 |
| C | 1 | 0 | 0 | 1 |
| D | 1 | 1 | 1 | 0 |
有向圖:
圖G(無權值)
圖G(有權值)
定義圖G[101][101],G[i][j]的值表示從結點vi到vj是否有邊或弧,若有,取值為1或權值,若無,則取值為0或∞。以下是圖G用鄰接矩陣表示的列表:
| 結點 | A | B | C | D |
| A | ∞ | 1 | 1 | ∞ |
| B | ∞ | ∞ | ∞ | ∞ |
| C | ∞ | ∞ | ∞ | 1 |
| D | ∞ | 1 | ∞ | ∞ |
| 結點 | A | B | C | D |
| A | ∞ | 10 | 3 | ∞ |
| B | ∞ | ∞ | ∞ | ∞ |
| C | ∞ | ∞ | ∞ | 6 |
| D | ∞ | 5 | ∞ | ∞ |
#include <iostream> #include <cstring> using namespace std; double G[101][101]; int main(){ int u,v,t,n,m; // 結點u到結點v的節點值為t cin >> n; for (int i = 1;i <= n;i++){ for (int j = 1;j <= n;j++){ G[i][j] = 0x7fffffff; // 初始化為無窮大 } } // 或者使用memset(G,0x7fffffff,sizeof(G))來初始化 /* 若是int類型數組,則採用memset(G,0x7f,sizeof(G))) 0x7fffffff表示無窮大,若是無向圖,那麼要寫成memset(G,0,sizeof(G)) 也可以定義成memset(G,oxaf,sizeof(G)),全都定義成很小的數。 */ cin >> m; for (int i = 1;i <= m;i++){ cin >> u >> v >> t; G[u][v] = t;G[v][u] = t; // 鄰接矩陣的值 } // 輸出 for (int i = 1;i <= n;i++){ for (int j = 1;j <= n;j++){ cout << G[i][j] << " "; } cout << endl; } return 0; }
這是定義鄰接矩陣的程式碼,大家可以根據需要查看注釋修改程式碼。

