树
树和二叉树的应用
并查集
Father[];判断两节点是否处于同一集合,高效地对集合进行合并;
优化:
(1)路径压缩:在Find(x)找代表元时,把x到代表元路径上的所有结点的父亲都改成代表元;
(2)按秩合并:“秩”,理解为对高度的估计;由于路径压缩时高度的减少很难计算(我也不知道为啥),所以只保存高度的上界(曾经最大高度),即“秩”;秩以相反数形式保存在father[代表元]中;注意并查集一般从1开始计数,若要用0,把father数组初值设为-1,且find中递归条件设置成<=-1;
图
图的存储结构
邻接矩阵
邻接表
图的遍历
DFS
BFS
拓扑排序与关键路径
最短路径
最小支撑树
Prim算法
S[v], Lowcost[v], pre[v];在集合V-S中选Lowcost值最低的点加入集合S,更新V-S中剩余点的Lowcost值,pre值;直到所有点在S中;
Prim算法更适合稠密图;
Kruskal算法
边集E[],并查集Father[];对边集排序,每次取权值最小的边,若该边的两端点不在同一集合内(不形成环)则把该边加入最小支撑树;
Kruskal算法更适合稀疏图;