前向星建图方法

我的前向星建图方法是这样的:

边用结构体表示,然后把所有边都存在数组中。将顶点的各个信息放在各个数组中储存。

每个顶点有一个int类型的first数组,代表了与它相连的第一条边的编号。每条边的struct内有一个next,代表了下一条与当前处理节点相连的边的编号。

当要为节点a和b添加边时,做两次操作,每次操作先创建新边,把新边的next置为当前的first,然后将主节点的first更新成当前边的编号。

这样建图的优势:

  1. 比起vector来说,节省时间,并且复杂度也不高。
  2. 比起邻接表(也就是指针版本)来说,避免了繁琐的指针操作。
  3. 比起每次将新边挂在最后的版本来说,节省了end数组。(这个应该好想吧)
  4. 把边封装成结构体,不会显得很散乱。
  5. (至于对于邻接矩阵的优势。。应该不用我多说了吧。。)

劣势:

  1. 不直观(相对于指针版本来说)
  2. 不方便(相对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   

 欢迎评论。。

posted @ 2017-08-22 16:21  pechpo  阅读(255)  评论(0编辑  收藏  举报