树结构_最小生成树_Prime算法
来源:互联网 发布:冒险岛数据查询 编辑:程序博客网 时间:2024/05/29 10:42
输入:一个加权连通图
算法思路:将图分为两个部分,一个是已经进入最小生成树的部分a,一个是还未进入最小生成树的部分b
现在我们在连接a和b的边中找到一条最小的,并把它加入最小生成树中
重复这个过程直到所有点都进入最小生成树
初始化:将第一个点的数据放入最小生成树即可
数学证明:
反证法:假设prim生成的不是最小生成树
1).设prim生成的树为G0
2).假设存在Gmin使得cost(Gmin)<cost(G0) 则在Gmin中存在<u,v>不属于G0
3).将<u,v>加入G0中可得一个环,且<u,v>不是该环的最长边(这是因为<u,v>∈Gmin)
4).这与prim每次生成最短边矛盾
5).故假设不成立,命题得证.
代码模板:long Prime(int n,int Graph[maxn][maxn]){ int vis[maxn],d[maxn]; memset(vis,0,sizeof(vis)); for (int i=1;i<=n;i++) d[i]=Graph[1][i];//初始化:从第一个点开始 for (int i=1;i<=n;i++)//一次找一个点所以需要n次这里的i只是为了计数而已 { int Min=inf,v; for (int j=1;j<=n;j++) if (!vis[j]&&d[j]<Min) {Min=d[j];v=j;}//找出不在集合里的距离最小的点 vis[v]=1;//这个东西就可以保证d[j]不再变化 for (int j=1;j<=n;j++)//保证在d[i]为i到连接到以联通的图中的最短路线博主真是太聪明了 if (!vis[j]&&d[j]>Graph[v][j]) d[j]=Graph[v][j]; } long cost(0); for (int i=1;i<=n;i++) cost+=d[i]; return cost;}
0 0
- 树结构_最小生成树_Prime算法
- 106_Prime 最小生成树
- poj_2031_已连接部分点的最小生成树_prime
- 树结构_最小生成树_Krustra(边数较少时使用)
- 贪心算法_最小生成树_Prim(普里姆)算法
- 贪心算法_无向图最小生成树*
- 求最小生成树_普里姆算法(Prim)
- 求最小生成树_克鲁斯卡尔算法(Kruskal)
- 数据结构_图_prim最小生成树算法
- 【算法】图论_最小生成树(MST)_Kruskal
- hihocdoer 1098_最小生成树二·Kruscal算法
- 图论中的贪婪算法_最小生成树
- 图结构练习——最小生成树 Prim算法
- 图结构练习——最小生成树 Kruskal算法
- 图结构练习——最小生成树(Prim算法)
- 最小生成树算法
- 最小生成树算法
- 最小生成树算法
- How tomcat works——12 StandardContext
- <Android开源库> Realm For Android~ Realm(译文)
- 低仿饿了么H5-纯前端Vue版 + 手把手教学
- HBase-CMS GC调优
- C#基础入门学习笔记——C#的四种基本数据类型
- 树结构_最小生成树_Prime算法
- 输出list的所有索引
- [Nginx]Nginx主配置参数详解,Nginx配置网站
- CT107D蓝桥杯串口实例(3)
- 蓝桥杯 垒骰子 (DP+矩阵快速幂)
- 怎样玩转线程的属性和方法
- 深度学习工作站搭建笔记
- Android Material Design —— CoordinatorLayout
- PAT-A1092