鄰接矩陣&鄰接表
鄰接矩陣
邏輯結構分為兩部分:V和E集合,其中,V是頂點,E是邊。因此,用一個一維陣列存放圖中所有頂點資料;用一個二維陣列存放頂點間關係(邊或弧)的資料,這個二維陣列稱為鄰接矩陣。鄰接矩陣又分為有向圖鄰接矩陣和無向圖鄰接矩陣
————百度百科
定義
- 對於無向圖,鄰接矩陣是對稱的,對角線為 0
- 無向圖中,任一頂點 i 的度為第 i 列(或第 i 行)所有非零元素的個數,在有向圖中頂點 i 的出度為第 i 行所有非零元素的個數,而入度為第 i 列所有非零元素的個數
- 存圖空間為 \(n^2\) , 由於無向圖對稱且對稱軸為 0,僅需 \(n(n-1)/2\)
特點
容易判斷兩個點是否相連,方便求度,但對於一個稀疏圖,空間上會浪費很多,所以要注意資料範圍
int n, m, o[zx][zx];
cin >> n >> m;
for(int i = 1; i <= m; i++){
cin >> u >> v;
o[u][v] = 1;
// o[v][u] = 1; 無向圖,也可以比較一下u v的大小隻存一個三角形的圖
}
不知道為什麼看到網上的大佬們寫30多行的指標 就很迷,心慌慌
鄰接表
直接舉栗子 o( =∩ω∩= )
4 5 //4個點 5條邊
1 4 9 //點 點 邊權
4 3 8
1 2 5
2 4 6
1 3 7
上面右圖為連結串列表示的鄰接表,是不是看到指標很激動, 下面介紹一下不用指標的鄰接表
使用陣列實現,每個點都存從這個點出發的所有邊,,此時要給每條邊編號,如下圖
這裡用三個陣列記錄(u,v,w)
再用一個數組first存每個頂點其中一條邊的編號(為了方便列舉每個頂點所連的邊),例如1 4 9,表示為first[1] = 1; 若一個點 i 出度為 0,則令first[i] = -1; 在讀入前,先給first陣列初始化為 1;
1 4 9 是以1為起點掃到的第一條邊,next陣列賦值為 -1 , 4 3 8 同理
現在讀入1 2 5, 把 first[1] 更新為 3,讓 next[3] 存原來 first[1] 的值,這樣就能連起來了
不難發現,遍歷頂點1的所有邊就跳來跳去就行了
建表
int n, m, u[zx], v[zx], w[zx], fisrt[zx], next[zx];
cin >> n >> m;
for(int i = 1; i <= n; i++) first[1] = -1;
for(int i = 1; i <= m; i++){
cin >> u[i] >> v[i] >> w[i];
next[i] = first[u[i]];
first[u[i]] = i;
}
遍歷其中一個點 i
int k = first[i];
while(k != -1){
k = next[k];
.....
}
遍歷全部
for(int i = 1; i <= n; i++){
int k = first[i];
while(k != -1){
k = next[k];
.....
}
}
啊,一個建圖也沒啥好講的,**畢竟都是大佬 **
✿✿ヽ(°▽°)ノ❀