鄰接矩陣看上去是個不錯的選擇,首先是容易理解,第二是索引和編排都很舒服但是我們也發現,對於邊數相對頂點較少的圖,這種結構無疑是存在對儲存空間的極大浪費。
因此我們可以考慮另外一種儲存結構方式,例如把陣列與鍊錶結合一起來儲存,這種方式在圖結構也適用,我們稱為鄰接表(adjacencylist)。
每乙個單鏈表設乙個表頭結點。
第i個單鏈表表示依附於頂點vi的邊(對有向圖是以頂點vi為頭或尾的弧)。
圖的鄰接表儲存法,又叫鏈式儲存法。本來是要用鍊錶實現的,但大多數情況下只要用陣列模擬即可。
l鄰接表(有向圖)
l鄰接表的處理方法是這樣:
l圖中頂點用乙個一維陣列儲存,當然,頂點也可以用單鏈表來儲存,不過陣列可以較容易地讀取頂點資訊,更加方便。
l圖中每個頂點vi的所有鄰接點構成乙個線性表,由於鄰接點的個數不確定,所以我們選擇用單鏈表來儲存。
但也有時為了便於確定頂點的入度或以頂點為弧頭的弧,我們可以建立乙個有向圖的逆鄰接表:
此時我們很容易就可以算出某個頂點的入度或出度是多少,判斷兩頂點是否存在弧也很容易實現。
對於帶權值的網圖,可以在邊表結點定義中再增加乙個資料域來儲存權值即可:
**實現:
1 #include2 #include3using
namespace
std;
4const
int e=5;//
e為最大邊數
5const
int n=3;//
n為最大定點數
6struct
edge edge[e];
9int head[n];//
表頭;10
int num;//
記憶體指標;
11void
chushi()
1217
void add_edge(int b,int e,int
w)18
25int
main()
2635 cout<<1;36
for(int i=head[1];i!=-1;i=edge[i].next) //
遍歷從點1開始的所有邊
3740
return0;
41 }
陣列模擬鄰接表
圖的鄰接矩陣儲存法,它的空間和時間複雜度都是n2,現在來介紹另外一種儲存圖的方法 鄰接表,這樣空間和時間複雜度就都是m。對於稀疏圖來說,m要遠遠小於n2。先上資料,如下。4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行兩個整數n m。n表示頂點個數 頂點編號為1 n m表示...
用陣列模擬鄰接表
struct edge edge max 3 1 一定要邊的範圍 int head max 頭節點 void init 初始化資訊,1 插入邊void insert int u,int v,int64 len 遍歷 for int i head top i 1 i edge i next 然後看題意...
ACM 用陣列模擬鄰接表
為了學最短路而補。用圖的鄰接矩陣儲存法,它的空間和時間複雜度都是n2,現在我來介紹另外一種儲存圖的方法 鄰接表,這樣空間和時間複雜度就都是m。對於稀疏圖來說,m要遠遠小於n2。先上資料,如下。第一行兩個整數n m。n表示頂點個數 頂點編號為1 n m表示邊的條數。接下來m行表示,每行有3個數x y ...