鄰接表,存儲方法跟樹的孩子鍊表示法相類似,是一種順序分配和鏈式分配相結合的存儲結構。如這個表頭結點所對應的頂點存在相鄰頂點,則把相鄰頂點依次存放於表頭結點所指向的單向鍊表中。
對於無向圖來說,使用鄰接表進行存儲也會出現數據冗餘,表頭結點A所指鍊表中存在一個指向C的表結點的同時,表頭結點C所指鍊表也會存在一個指向A的表結點。
基本介紹
- 中文名:鄰接表
- 外文名:adjacency list
- 分類:順序分配和鏈式分配
- 性質:存儲結構
- 作用:存儲圖
簡介
表示法
有向圖
逆鄰接表
鄰接表的形式說明
#include <vector>#include <iostream>using namespace std;int main(){ vector<vector<size_t>> graph(5); graph[0].push_back(1);//V0->V1. graph[1].push_back(4);//V1->V4. graph[1].push_back(0);//V1->V0. graph[2].push_back(1);//V2->V1. graph[2].push_back(3);//V2->V3. graph[3].push_back(0);//V3->V0. graph[4].push_back(3);//V4->V3. //假定要訪問點1. for(const auto &ele:graph[1])//對於全部屬於graph[1]這個容器的元素 std::cout<<ele<<''; std::cout<<std::endl; //程式運行後輸出40,表示點1連線了4點和0點。 return 0;}
#include<map>#include<set>#include<iostream>#include<cstddef>#include<map>#include<set>intmain(){std::map<std::size_t,std::set<std::size_t>>graph;graph[0].insert(1);//V0->V1.graph[1].insert(4);//V1->V4.graph[1].insert(0);//V1->V0.graph[2].insert(1);//V2->V1.graph[2].insert(3);//V2->V3.graph[3].insert(0);//V3->V0.graph[4].insert(3);//V4->V3.//假定要訪問點1.for(constauto&ele:graph[1])//對於全部屬於graph[1]這個容器的元素std::cout<<ele<<'';std::cout<<std::endl;//程式運行後輸出04,表示點1連線了0點和4點。對map,set里的元素進行遍歷是有序的return0;}
#include<vector>#include<iostream>#include<utility>#include<cstddef>intmain(){std::vector<std::vector<std::pair<std::size_t,std::size_t>>>graph(5);//每條邊的第二個元素不能是疊代器!!會失效!!!!必須是下標!!!//比如有一條a-b的邊,我們得讓它實現互訪。我們這裡假定a=2,b=4;std::size_ta(2),b(4);graph[a].push_back(std::make_pair(b,graph[b].size()+(a==b)));//Va->Vb.需要判定a是否等於b.graph[b].push_back(std::make_pair(a,graph[a].size()-1));//Vb->Va,這個不需要判定a是否等於b.//訪問反向邊的方法.for(constauto&ele:graph[a])//訪問點agraph[ele.first][ele.second];//這就是邊ele的反向邊了return0;}
pascal程式
program ljb;type node=^link link=record qu,g:longint; next:node; end;var nd:array[1..100000]of node; n,m,i,u,v,w:longint;procedure dfs(wei:longint);var p:node;begin writeln(wei); p:=nd[wei]; while p<>nil do begin dfs(p^.g); p:=p^.next; end;end;procedure addd(u,v,w:longint); //建立鄰接表var p:node;begin new(p); p^.g:=v; p^.next:=nd[u]; p^.qu:=w; nd[u]:=p;end;begin readln(n,m); //n:結點數 m:邊數 for i:=1 to m do begin readln(u,v,w); addd(u,v,w); end; dfs(1);//從1號節點開始dfsend.