存图方式---邻接表&邻接矩阵&前向星
基于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 }
越努力,越幸运