首先,那个师兄跟我们讲了讲图的一些基础,例如邻接矩阵可以用邻接表代替之类什么的(然而在没听过邻接表这个东西的时候就一般都这样储存了,原因是我们拥有智商)。
接下来统一记录我们以前不知道的一些知识:
无向图有向图:其实顾名思义,无向图就是没有方向,只要与其相连的边都可以互相到达。而有向图就是指只能按照一条边边的方向到达一条边。
阶:图中顶点的个数为阶。
完全图:每一条边都与其余的每条边相连(可得知总共有n*(n-1) div 2条边)。
顶点的度:入度——以该点为终点有多少条边可以到达这个点。出度——以该点为起点可以连向多少条边。
([定理1] 图G中所有顶点的度数之和等于边数的2倍。因为计算顶点的度数时,每条边均用到2次。
[定理2] 任意一个图一定有偶数个奇点。)
简单路径:当前一个路径序列中的顶点不重复出现。(路径中存在相同顶点的称之为回路,起点和终点相同的为简单回路)
在无向图中如果对于一个图中的任意两个顶点都可到达,则称之为连通图,否则称之为非连通图。而在有向或无向图中如果任意两个顶点可以互相到达,则称之为强连通图。
稠密图:边数>最大边数/2
稀疏图:边数<最大边数/2
上面都是一些最基础的东西,他还讲了一个算法:Prim算法和Kruskal算法。
分别讲述一下:
Prim算法:就是指当前以点k为起点,从这个点开始生成(任意一个点开始生成都可以,因为始终这个点会被连上)然后找一条当前已选过的点所连的权值最小的一个点,如果这个点还未被连过,则把这个点连上,以此类推,每次连点的时候记录一下就行了。
Kruskal算法:把当前每条边的权值按从小到大排序,然后从头开始判断这条边的两个顶点是否在一个集合里,如果不在的话就用并查集把两个集合并成一个集合,如果已经在一个集合里的话则不能连这个点,然后以此类推,每次连点的时候记录一下就行了。
分析一下两个算法的时间复杂度:
Prim算法因为至多有N个点,当图为完全图的时候,最坏时间复杂度明显是O(n*m),而kruskal的时间复杂度其实大概是由排序的算法决定的,最精确的应该是O(m*logm)