存圖方式---鄰接表&鄰接矩陣
阿新 • • 發佈:2018-04-07
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 }
存圖方式---鄰接表&鄰接矩陣