prim
来源:互联网 发布:小米网络助手apk通用版 编辑:程序博客网 时间:2024/05/20 02:24
void Prim(MGraph g,int v,int &sum) /* *LowCost[i]:当前生成树(U集合)到顶点i的多条边中最短的一条边。 *VexSet[i]:顶点i不在生成树中。1表示在里面,0反之。 *MGraph用的邻接矩阵表示,其中用edges[i][j]来记录i-->j是否有关系。n表示顶点个数,e表示边的个数。 */ void Prim(MGraph g,int v,int &sum) { int LowCost[Max],VexSet[Max],v; int i,j,k,min; //初始化LowCost,VexSet数组 for(i=0;i<g.n;i++) { LowCost[i]=g.edges[v][i]; VexSet[i]=0; } VexSet[v]=1; sum=0; /*------------------------------------------------我是分割线---------------------------------------------------------*/ for(i=0;i<g.n;i++) { min = INF;//表示无穷或者大于所有的权值就行 //找出LowCost的最短代价(权值)即找出最短边中的最短的一条。 for(j=0;j<g.n;j++) { if(VexSet[j]==0&&LowCost[j]<min) { min = LowCost[j]; k=j; } } //将该条边加入生成树中 VexSet[k]=1; v=k; sum+=min;//这个可以根据需要调整,这里做的是计算min的和。 //加入一个顶点v之后,生成树到各个不在生成树的顶点的最小值也会变。 //即更新LowCost数组(只计算不在生成树的顶点且只要更新与新添进去的顶点相关的边)。 for(j=0;j<g.n;j++) { if(VexSet[j]==0&&g.edges[v][j]<LowCost[j]) { LowCost[j]=g.edges[v][j]; } } } }
最小生成树
3条构造最小生成树的准则:
- 只能使用该网络中的边来构造最小生成树
- 只能使用恰好n-1条边来联结网络中的n个结点
- 选用的这个n-1条边不能构成回路。
MST性质
假设N=(V,{E})是一个连通网,U是顶点集合V的一个非空子集。若(u,v)是一条具有最小值(代价)的边,其中u属于U,v属于V-U(即U对立集合),那么必存在一颗包含边(u,v)的最小生成树。
注意prim和kruskal算法都是利用MST性质
如何利用MST性质来构造最小生成树?
我们知道权值最小的肯定在最小生成树中,权值次小的边也会被至少一颗生成树采用,关键第三小的边选择(由于第三条边可能出现回路,从而不满足树的定义)。由此我们可以使用不同策略来解决回路问题常见的算法有Prim算法和kruskal算法。(都用了贪心策略)
Prim算法
解决上述的关键点思想是:将定点集合分成两个U,V-U(初始状态U中只有一个Uo),再加上一个TE集合来表示最小生成树边的集合。
- prim
- Prim
- Prim
- prim
- Prim
- prim
- prim
- Prim
- prim
- Prim
- Prim
- Prim
- prim
- prim
- prim
- prim
- Prim
- prim 算法
- 配置VPN服务器使用L2TP/IPSEC协议
- 当腾讯真的成为“中国第四大运营商”……
- TextView、Button、EditText
- OOo-MySpell 一个C++的拼写语法检查开源项目
- C内存
- prim
- C++中volatile的作用
- 转VC中char *name 与 char name[]的区别(基础知识)
- Asp.net 缓存技术2
- IOS程序名称及内容国际化(本地化)
- A51伪指令
- java for 的几种用法
- hdu_4362 Dragon Ball (DP+单调栈)
- 晶振旁外接电容的选择