福州培训最后一天
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