存图方式---邻接表&邻接矩阵&前向星

基于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 }
原文地址:https://www.cnblogs.com/fzl194/p/8729203.html