数据结构:邻接矩阵
創建鄰接矩陣,其實在離散數學中我們已經學過了,這里只是把它邊的代碼化了;這里就以下面這個簡簡單單的圖為例子來講怎么創建一個鄰接矩陣吧。
這里分有向圖和無向圖來討論
1.無向圖和無向圖的鄰接矩陣
?由于無向圖和無向圖的邊都是沒有權值的,所以我們用1表示某兩頂點之間有邊存在,用0表示這兩邊是沒有邊存在的。
首先,我們看G2,他有4個頂點,所以,我們用一個(n*n)5*5的數組來存這個圖,也就是說,我們要建一個這么大的鄰接矩陣;
行就分別表示v1 v2 v3 v4;
列也是v1 v2 v3 v4;
我們需要了解的一點就是!v(i,j)表示vi到vj之間是否有邊;
- 先看v1這個頂點,他和v2? ?v4相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?看第一行(也就是v1這一行),找到v2和v4下面都寫上1;
- ?再看v2這個頂點,他和v1? ? v3? ? v5相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?看第二行(也就是v2這一行),找到v1和v3、v5下面都寫上1;
- 再看v3這個頂點,他和v2? ?v4? ?v5相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?我們看第三行(也就是v3這一行),找到v2和v4、v5下面都寫上1;
- 看v4這個頂點,他和v1 ? v3相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 看第四行(也就是v4這一行),找到v1和v3下面都寫上1;
- 看v5這個頂點,他和v2 ? v3相連;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?看第五行(也就是v5這一行),找到v2和v3下面都寫上1;
然后我們再看G1,就是同理,因為G1是一個有向圖,也就是同理,只不過有向圖他兩點之間是用箭頭鏈接,這樣我們只要看,誰指向誰,就說明這兩個之間是聯通的。
v<i,j>就表示i到j之間是否為通的。
這里的G1,4個頂點,聰明的你一個會舉一反三了吧,哈哈哈哈,就是和上面那個一樣的,答案已經在上面給出了奧,
下面我們就看代碼吧:
#include<iostraem> #include<malloc> #include<string> #include<cstring> #define MVNum 100; typedef VerTexType char; using namespace std; //鄰接矩陣(數組/順序存儲) typedef struct {VerTexType vexs[MVNum];//頂點表Arctype arcs[MVNum][MVNum];//鄰接表,,記得初始化為0奧,我這里沒有寫了int vexnum,arcnum;//分別表示頂點數和邊的數量 }AMGraph;int Locate(AmGraph G,VerTexType u){for(int i=0;i<G.vexnum;i++){if(G.vexs[i]==u)return i;}return -1; } Status CreateUDN(AMGraph &G){cin>>G.vexnum>>G.arcnum;for(int i=0;i<G.vexnum;i++)cin>>G.vexs[i];for(int i=0;i<G.arcnum;i++)for(int j=0;j<G.arcnum;j++){G.arcs[i][j]=INT_MAX;}VerTexType v1,v2;int i,j,w;for(int k=0;k<G.arcnum;k++){cin>>v1>>v2;i=Locate(G,v1);j=Locate(G,v2);G.arcs[i][j]=1;G.arcs[i][j]=G.arcs[j][i];}return 1; }2.網的鄰接矩陣
接下來是網的鄰接矩陣了,這里注意就是,鏈接兩點的邊如果有權值我們就把他叫做網,這時候,鄰接矩陣中對應得v[i][j]就不是表示存不存在邊了,而是寫他這一條邊的權值:
方法還是和上面的一樣,只不過這里把沒有邊改成了無窮大;方便我們做后面的算法;
?下面我們就看看代碼把
#include<iostraem> #include<malloc> #include<string> #include<cstring> #define MVNum 100; typedef VerTexType char; using namespace std; //鄰接矩陣(數組/順序存儲) typedef struct {VerTexType vexs[MVNum];//頂點表Arctype arcs[MVNum][MVNum];//鄰接表int vexnum,arcnum;//分別表示頂點數和邊的數量 }AMGraph;int Locate(AmGraph G,VerTexType u){for(int i=0;i<G.vexnum;i++){if(G.vexs[i]==u)return i;}return -1; } Status CreateUDN(AMGraph &G){cin>>G.vexnum>>G.arcnum;for(int i=0;i<G.vexnum;i++)cin>>G.vexs[i];for(int i=0;i<G.arcnum;i++)for(int j=0;j<G.arcnum;j++){G.arcs[i][j]=INT_MAX;}VerTexType v1,v2;int i,j,w;for(int k=0;k<G.arcnum;k++){cin>>v1>>v2>>w;i=Locate(G,v1);j=Locate(G,v2);G.arcs[i][j]=w;G.arcs[i][j]=G.arcs[j][i];}return 1; }嗯............那我們就總結一下這個鄰接矩陣得優點和去缺點吧
一、優點:
1. 直觀,簡單,好理解
2.方便查找某兩邊之間是否存在邊
3.方便尋找某一頂點直接相鄰的點
4.方便計算各個頂點的入度和出度
二、缺點:
1.不利于增加和刪除頂點;
2.浪費空間——特別在稀疏圖中
3.浪費時間——比如統計圖中邊的數目
總結
- 上一篇: 项目管理及Office Project
- 下一篇: Windows跟Linux的不同处理