一、图的表示
1.邻接表
假设顶点有1,2,3,4,5
G=[[2,3], #1的邻接表
[4,3,5], #2的邻接表
[1,4], #3的邻接表
[3], #4的邻接表
[1,3]] #5的邻接表
邻接表可以是list,set(集合),dict,如果是dict,则可以表示权重了
2.邻接矩阵
a, b, c, d, e, f, g, h = range(8)
N = [[0, 1, 1, 1, 1, 1, 0, 0], # a的邻接情况
[0, 0, 1, 0, 1, 0, 0, 0], # b 的邻居表
[0, 0, 0, 1, 0, 0, 0, 0], # c 的邻居表
[0, 0, 0, 0, 1, 0, 0, 0], # d 的邻居表
[0, 0, 0, 0, 0, 1, 0, 0], # e 的邻居表
[0, 0, 1, 0, 0, 0, 1, 1], # f 的邻居表
[0, 0, 0, 0, 0, 1, 0, 1], # g 的邻居表
[0, 0, 0, 0, 0, 1, 1, 0]] # h 的邻居表
0表示不相邻,1表示相邻
对称方阵,对角线元素为0,
把1改成具体数值,则可表示权重了
二、最小生成树
生成树(spanning tree):含有图中所有n个顶点,包含图中n-1条边的一棵树。有生成树的图必须是无向连通的。生成树肯定不止一种。
生成树的代价:所有边的权重和
最小生成树:代价最小的生成树
1.Kruskal方法构建最小生成树
1)将边按权重从小到大排序
2)将最小权重边加入树(起始)
3)从剩下的边中选最小的边加入树,加入前需要判断此边的加入是否会构成环,如果会,则不加入。
4)重复3),直到所有点都在一个连通图上。
2.Prim方法构建最小生成树
1)所有顶点V={a,b,c,d,e},随机选a为起点,把a加入U={a},此时V={b,c,d,e}
2) 找到U中所有点与V中点连通的所有边,选择一条最短的加入树,并把此边连接的V中的点移到U中
3)重复2),直到V中无点