福州培训之图论(2月12日)

                                                          福州培训最后一天

Emmmm

最后一天了

不知该怎么说

我能写一篇培训感受吗,算了,还是写上课笔记吧,其实也没啥笔记,根本没听懂

图论:

图是由一个顶点的集合V和一个顶点间关系的集合E组成,记为G=(V,E)

V:顶点的有限非空集合

E:顶点间关系的优先集合(边集)

存在一个结点V,可能含多个前驱结点和后继结点,用不带箭头的边表示结点关系

有向图:按照固定方向走,通常用带箭头的边连接两个有关联的结点

无向图:可往反方向走

路径、简单路径、回路:

1.    如果一条路径上的结点除起点x1和终点xk可以相同外,其他结点均不同,则称此为一条简单路径。

2.    X1=xk的简单路径成为回路(也称为环)

储存方式:

邻接矩阵:

空间复杂度为O(n2),表示结点间相邻关系的矩阵。

          格式:

          a[i][j]={1(或权值):无向图:有边(i,j)和边(j,i);有向图:有边<i,j> / 0:i到j无边}

          输入:

           对角线为0:结点自身不相连

           无向图:是对称矩阵。有向图一般不是

           第i行非0的个数是结点i的度

          输入情况:

1.    直接给出邻接矩阵,直接读入即可

2.    给出边的顶点

3.    给出每个结点的邻接点

(详细代码见黑皮书)

 

邻接表:

     空间复杂度为O(|E|),

1.    无权图:设置结点指针

结点——>邻接点指针

2.    有权图:*结点——>邻接点指针;邻接点——>边权值——>下一个邻接点指针

3.    用数组模拟有权图:对于从x为起始点的边,在邻接表里装入所对应的y值,以及权值v,以及以x为起点的前一个所对应的y值的编号,link数组里装入以i好点为起点的边中所对应的最后一个y值。我们可以这样理解e数组,e数组里包含了n个链表,每个表都是以某个端点为起点的边的集合。这要好好理解一下。

*结点相邻边的总数s——>第一条邻接边next ;邻接点——>边权值——>下一个邻接边

    储存邻接表:(详情见黑皮书)

有向无环图:这是什么鬼

 

邻接矩阵和邻接表的优点:

 邻接矩阵:代码书写简单,找邻接点慢

           采用二维数组的静态存储结构

           一般点数|v|小于等于5000的时候,用邻接矩阵。

邻接表:代码书写较复杂,找邻接点快,适用于稀疏图

       采用动态存储结构(指针或用数组模拟)

        一般点数|v|大于等于5000,并且边得个数不是很多的时候,用邻接表,

        并且现在一般都用数组来模拟。

     数组模拟链表的速度会快一点,并且能避免一些错误。

对于在图论里数据出现的重边问题,邻接矩阵必须判断,邻接表则可以直接处理

/*边集数组:*/

前向星(可背邻接表代替)

图的遍历:

1. 深度优先搜索DFS:

遍历算法(递归过程)

(1).从某一初始点出发点i开始访问,输出该点编号,并对改点做被访问标志(以免被重复访问)

(2).再从i的其中一个未被访问的邻接点j作为初始点出发继续深搜。

  当i的所有邻接点都被访问完,则退回到i的父结点,当另一个邻接点k再继续深搜直到全部结点访问完毕

2. 广度优先搜索(宽度优先搜索)BFS

按层次遍历:

 从图中某结点i出发,在访问i之后,再一次访问i的各个未曾访问的邻接点,然后分别从这些邻接点出发按广度优先搜索的顺序遍历图,直至图中所有可被访问的结点都被访问到。

图的传递闭包:

   判断无向图的连通性

G的传递闭包:G*=(V,E*)

              E*={(i,j):图G中存在一条i到j的路径}表示(见黑皮书)

  入度:

以该顶点为终点的边的数目和

  出度:

    以该顶点为起始点的边的数目和

入度为0的点即可做开头

度数为奇数的顶点叫做奇点,度数为偶数的顶点叫做偶点

度:等于该顶点的入度和出度之和

结论:图中所有顶点的度=边数的两倍

最早能做开头的点到最后能做开头的点依次排序

生成树:

无向图,取其中|v|-1条边,并连接所有顶点,则组成原图的一个生成树

 |属性|:|v|-1条边、连通、无环

最小生成树: 加权图的最小生成树是一棵生成树

Prim普通算法 O(|v|2)

Prim算法中用“堆“方法   O((|E|+|V|)*log|V|)-----对稀疏图较好

Kruskal算法  O(|E|*log|E|+|N|*A|V|)-----对稀疏图较好

最短路:从某一个点到另一个点的最短路径

  Dijkstra算法:

      定义:单源点最短路径

      迪杰斯特拉算法应用的是贪心的思想,这个算法的思路的出发点是,如果源点到某个点x的距离是到其他点的距离的最小值,那么到第点x的最短距离

       目标:图中下一个顶点到其他顶点的最短路径,不能有负权。----单源,非负

       原理:经严格证明的贪心

       时间复杂度:O(n2)

  SPFA算法:

      每次都要检查所有边,这看起来比较浪费,对于(x,y),如果上一次dis[x]没有改变,则本次的检查显然多余

      我们每次只要从上次刚被“松弛“过的点x,来看看x能不能松弛其他点即可

      SPFA算法中用BFS中的队列来存放刚被“松弛“过的点,由于顶点个数未|V|,队列如果用数组的话显然要用”循环队列“使用空间

      时间复杂度:O(K*E)

  Floyed算法:

      目标:把图中任意点i与j之间的最短距离都求出来

      原理:根据图的传递闭包思想:

             If(d[i][k]+d[k][j]<d[i][j])

                d[i][j]=d[i][k]+d[k][j];

      时间复杂度:O(n3)

  博客到此为止,拓补可能有些问题,需自行参考,that’s all

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值