1. 程式人生 > >存圖方式---鄰接表&鄰接矩陣

存圖方式---鄰接表&鄰接矩陣

tro 鄰接表 下標 vector truct get AD cto add

基於vector存圖

 1 struct Edge
 2 {
 3     int u, v, w;
 4     Edge(){}
 5     Edge(int u, int v, int w):u(u), v(v), w(w){}
 6 };
 7 vector<Edge>edges;//把每一條邊存下來
 8 vector<int>Map[maxn];//G[i]這個vector存的是以i為起點的所有邊在edges裏面的下標
 9 void init(int n)
10 {
11     for(int i = 0; i <= n; i++)Map[i].clear();
12 edges.clear(); 13 } 14 void addedge(int u, int v, int w) 15 { 16 edges.push_back(Edge(u, v, w));//註意無向圖需要存兩條邊 17 m = edges.size(); 18 Map[u].push_back(m - 1); 19 } 20 void Find(int u)//遍歷以u為起點的所有邊 21 { 22 for(int i = 0; i < Map[u].size(); i++) 23 { 24 Edge&e = edges[Map[u][i]];
25 //使用e就可以遍歷以u為起點的所有的邊 26 } 27 }

用鄰接矩陣的代碼比較簡單,就不加上來了

使用鏈表存圖

https://www.cnblogs.com/ECJTUACM-873284962/p/6905416.html

 1 struct edge
 2 {
 3     int next;//指向下一個節點
 4     int u, v, w;
 5 };
 6 edge a[maxn];
 7 int head[maxn], node;//node記錄節點的數目,head[i]記錄連接著i的第一條邊
 8 void add(int u, int v, int w)
9 { 10 a[node].u = u; 11 a[node].v = v; 12 a[node].w = w; 13 a[node].next = head[u]; 14 head[u] = node++; 15 } 16 void init() 17 { 18 node = 0; 19 memset(head, -1, sizeof(head)); 20 } 21 void Find(int u) 22 { 23 for(int i = head[u]; i != -1; i = a[i].next) 24 { 25 edge& e = a[i]; 26 //e就是連接著u的所有邊 27 } 28 }

存圖方式---鄰接表&鄰接矩陣