对于图的储存的总结(一)

来源:互联网 发布:淘宝网男花保 套装 编辑:程序博客网 时间:2024/06/05 00:16

经过两个上午的课,我知道了一些关于图的储存的知识,例如链式前向星(本人蒟蒻)等,然后我必须认真的总结。

  (一)邻接矩阵:

           这东西挺简单,很纯的用bool数组存储关系。就是用一个bool型的数组储存一个点与另一个点的连接关系,通俗一点就是点i和点j之间有没有边。

           具体思路:用一个二维bool数组记录点i与点j之间的关系,如果有边赋值为真,否则为假(或反之)。

           由于代码简单,这里就不给出了。

  (二)邻接表:

           一般这个很让人懵,关键是它违反了我的惯性思想

           它的思想是:用n个链表来储存关系,第i个链表储存的是与点i相连的点

           但由于链表太繁琐了,在OI中特别容易出错,一般不推荐用链表

           所以我们一般使用数组模拟链表!!!!

           这是个啥操作嘞?

           具体是这样的——首先用一个link数组,link[i]代表与点i直接相连的所有点中最后被记录到的点在e数组中的位置

                                           然后用一个e数组,是结构体,这个结构体有两个元素——t与next

                                           t记录的是这个点的编号

                                           next记录的是与这个点的同组的点的下一个点的位置    这个next你可能不懂什么意思

                                           什么是同组呢?同组就是它们与同一个点相连,那么其实就是点i比点i.next迟记录到一点。

                                           理解了各种变量的意思,就是储存了

                                           首先你要输入两个点x与y(可能还有边权值,在开个z保存就行了),给x的相连点中多开一个点就行了核心代码:

void ins(int xx,int yy){  e[++tt].x=yy;  e[tt].next=lin[xx];lin[xx]=tt;}
                                           最后还有一个神奇的循环枚举:

  for (int i=lin[x];i;i=e[i].next)
                                           这个循环是用于枚举与点i相连的点的。

完结撒花