图的表示方法

来源:互联网 发布:百万公众网络测试平台 编辑:程序博客网 时间:2024/06/09 19:58
图,是信息学竞赛中一项相当复杂又重要的内容,别具特色。图有许多表示方法,下面来逐一介绍。
【邻接矩阵】
邻接矩阵是一种最简单的表示方法,如果有一条边(u,v),权值为d,则Graph[u][v]=d。也就是说,对于有向边,Graph[入点][出点]=权值,而无向边则可以拆成两条有向边。
【前向星】
其实就是将所有的边存储下来,并排序。比如说有一个结构体,存储着一条边的u,v,d,也就是入点、出点、权值,接着开一个数组就可以了,一般来说需要排序。
【*特殊表示法:树*】
因为树是一种线性结构,所以有父亲表示法、孩子表示法、兄弟表示法等,各有特点。父亲表示法就是存储自己的父亲,孩子表示法就是存储所有自己的孩子(可以放在数组里),兄弟表示法一般和孩子表示法相配合,就是存储自己的所有兄弟,但是也可以是单个兄弟,通过类似于链表的方式找到全部的兄弟。
树的表示方法还有一种递归定义的结构,比如说这样的一个树:
图的表示方法 - wenjianwei1 - 算法的设计
 
就可以用1(2(3(),4(),5(6())),7(),8(9(),10()))来表示。二叉树的表示方法更为特殊,记一下两棵子树left和right就可以了。
【邻接表】
”邻接表是最好的图的表示方法“,至少在我的看法而言是对的。邻接表不仅速度快,而且占用的空间较小,乃是图论之必备数据结构。
简单来说,邻接表就是一种哈希表。假如这个哈希表的放入位置取决于入点,而实际的值取决于出点。就像下面的这样:
图的表示方法 - wenjianwei1 - 算法的设计
 
也就是说,是这样的:

list<int> Graph[MAXN];

其中list<int>[u]存的是当前的u点的所有到达的点的编号。这样的话显然空间的占用也并不大,某一条边(u,v)可以这样存:Graph[u].push_back(v)。(虽说我忘记list有没有push_back了)或者说手写一个也可以,添加在头。这样的空间复杂度和边数大致相同。
0 0
原创粉丝点击