首页 > 其他 > 详细

图的存储

时间:2020-04-11 15:17:56      阅读:63      评论:0      收藏:0      [点我收藏+]

以这幅图作为例子,我们来讲讲如何存储一幅图

技术分享图片

 

  第一种办法是使用邻接矩阵。其实质是使用一个二维数组进行图的存储。对于样例,我们可以这样存储:

技术分享图片

  这样的存储方式很容易理解,例如:(2,1)这个点的值为一,说明顶点2与顶点1之间存在一条边;(4,2)这个点的值为0,说明顶点4与顶点2之间不存在边。对于有权图,我们可以把1改为边的权值。 

 

  第二种办法是前向星。首先我们需要给边排序,以怎么的规则排序的。以边的起点作为关键字排序。对于例子中的这个图,我们可以这样排序:

技术分享图片

  注意:这里边上的数值并不是边权,只是标号

  然后我们将这些边按编号存入edge数组中(实际上是将该边连接的另一个顶点存储在数值中),并且对于每个顶点i编号最小的那条边,我们将它的编号存在head[i]中;编号最大的那条边,我们将其存在tail[i]中。 这样,我们就知道与顶点i相连的边是edge数组中从下标为head[i]到tail[i]的边。此外,可以用一个存储每个顶点的度的数组来替代tail数组。

 

  还有一种方法是链式前向星。

 1 int head[maxNodeSize] = {0};    //记录各个顶点的第一条边
 2 
 3 //用于存储边的结构
 4 struct node {
 5     int to;     //边的终点
 6     int next;   //与该边同起点边的下一条边
 7 };
 8 struct node edge[maxEdgeSize] = {0};
 9 int num = 0;    //目前边的总数
10 
11 void add(int from, int to) {
12     ++num;
13     edege[num].to = to;
14     edge[num].next = head[from];    //原起点边变成新边的下一条边
15     head[from] = num;               //使新边成为该顶点的起点边
16 }

 

  当然,存储图的方式有很多种,本篇博客只是讲述了其中的三种,有兴趣的朋友可以自行搜索学习。

图的存储

原文:https://www.cnblogs.com/zymmyz/p/12579672.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!