专栏简介 :java语法及数据结构
题目来源:leetcode,牛客,剑指offer.
创作目标:记录学习MySql学习历程
希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长.
学历代表过去,能力代表现在,学习能力代表未来!
目录
1. 最小生成树
连通图中的每一棵生成树 , 都是原图的极大无环子图 , 即: 从中删去任何一条边 , 生成树就不再连通;反之 , 在其中引入任何一条新边 , 都会形成一条回路.
若连通图由n个顶点组成 , 则其生成树必含n个顶点和n-1条边 , 因此构造最小生成树有三个准则:
- 1.只能使用图中的边来构造最小生成树
- 2.只能使用恰好n-1条边来连接图中的n个顶点
- 3.选用的n-1条边不能构成回路
常见求解最小生成树的算法有: Kruskal算法和Prime算法.两种算法都采用逐步求解的贪心策略.
贪心算法: 通过局部最优解来推出全局最优解.
1.1 Kruskal(克鲁斯卡尔) 算法
给定一个有n个顶点的连通网络N={V,E}
首先构造一个由这n个顶点组成 , 不含任何边的图G={V,NULL}.
其次不断从E中取出权值最小的一条边(若有多条任选其一) , 若该边的两个顶点来自不同的连通分量 , 则将此边加入到G中.
如此反复 , 直到G中边数达到顶点数-1为止.
核心: 每次迭代时 , 选出权值最小且两端点不在同一连通分量上的边 , 加入生成树.
步骤分析:
- 1.由于该算法的思想是全局贪心 , 因此将所有图中所有边全部放入优先级队列中.
- 2.构造一个最小生成树 ,