習題18-1 用連結串列來實現鄰接表
阿新 • • 發佈:2021-08-10
一、儲存鄰接表的兩種方式
1、vector儲存法
vector<int> edge[N]
2、鏈式前向星
鏈式前向星是鄰接表存圖的第二種,一般遍歷的圖比較大的時候可以用,比用向量存圖的那種鄰接表要快。
它是一種以邊為主的存圖方式,下面我會對其進行介紹:\(idx\)表示邊的位置, \(h[i]\)表示以\(i\)為起點第一條邊的位置,\(e[i]\)表示以\(i\)這條邊的終點,\(w[i]\)表示\(i\)這條邊的權值,\(ne[i]\)表示以這條邊同起點下一條邊的位置。
二、鏈式前向星程式碼
#include <bits/stdc++.h> using namespace std; //用連結串列來代替vector實現鄰接表 (用陣列來模擬儲存連結串列) 拉鍊法的HASH表 const int N = 1010; //結點個數 int h[N]; //h[N]表示有N條單鏈表的頭 int e[N << 1]; //e[N<<1]代表每個節點的值 連結串列記錄的是關係 int ne[N << 1]; //ne[N<<1]代表每個節點的下一個節點號 連結串列記錄的是關係 int idx; //結點編號 int w[N << 1]; //邊的權值 //一般認為N<<1就夠用了,就是2*N個大小 // 新增一條邊a->b (頭插法),邊權值是val void add(int a, int b, int val) {//有的時候可以不用建立權值 e[idx] = b, ne[idx] = h[a], w[idx] = val, h[a] = idx++; // https://www.acwing.com/video/21/ yxc老師的講解頭插法 // ne[idx]=h[a]的意義:將原來h[a]是指向第一個子結點的,現在,記錄idx的下一個結點是原來的第一個節點,它現在是第一個了, // 原來的第一個是第二個了。 // h[a]=idx++的意義: a這個結點的第一個子結點是idx了,然後再把 idx增加1個!方便下次加入新結點 } int main() { //給定初始值 memset(h, -1, sizeof h); /* 遍歷以u為出發點的連結串列辦法 for(int i=1;i<=n;i++){ //n個點 for (int j = h[u]; j != -1; j = ne[j]) {//遍歷以i為起點的所有邊 } } 其實鏈式前向星也是列舉每個起點的所有邊,只不過它是以邊進行建圖的 */ return 0; }