我的前向星建图方法是这样的:
边用结构体表示,然后把所有边都存在数组中。将顶点的各个信息放在各个数组中储存。
每个顶点有一个int类型的first数组,代表了与它相连的第一条边的编号。每条边的struct内有一个next,代表了下一条与当前处理节点相连的边的编号。
当要为节点a和b添加边时,做两次操作,每次操作先创建新边,把新边的next置为当前的first,然后将主节点的first更新成当前边的编号。
这样建图的优势:
- 比起vector来说,节省时间,并且复杂度也不高。
- 比起邻接表(也就是指针版本)来说,避免了繁琐的指针操作。
- 比起每次将新边挂在最后的版本来说,节省了end数组。(这个应该好想吧)
- 把边封装成结构体,不会显得很散乱。
- (至于对于邻接矩阵的优势。。应该不用我多说了吧。。)
劣势:
- 不直观(相对于指针版本来说)
- 不方便(相对vector版和邻接矩阵来说)
这种建图方式还是比较好码的,,下面贴上关键代码。
1 const int maxn=205, maxe=40005; 2 int n, cntedge; 3 int v[maxn], u[maxn], first[maxn], visit[maxn]; //关于节点的东西 4 struct Edge{ 5 int to, w, next; 6 }; 7 Edge edge[maxe]; //储存边 8 9 void create_edge(int from, int to, int weight){ //造边 10 edge[++cntedge]=Edge{to, weight, first[from]}; 11 first[from]=cntedge; 12 return; 13 } 14 15 nowedge=first[nownode]; //遍历 16 while (nowedge){ 17 …… 18 nowedge=edge[nowedge].next; 19 } 20
欢迎评论。。