最小生成树---Kruskal/Prime算法
1.Kruskal算法
图的存贮采用边集数组或邻接矩阵,权值相等的边在数组中排列次序可任意,边较多的不很实用,浪费时间,适合稀疏图。
方法:将图中边按其权值由小到大的次序顺序选取,若选边后不形成回路,则保留作为一条边,若形成回路则除去.依次选够(n-1)条边,即得最小生成树.(n为顶点数)。
Kruskal算法在图G=(V,E)上的运行时间取决于分离集合这一数据结构如何实现。采用在分离集合中描述的按行结合和通路压缩的启发式方法来实现分离集合森林的结构,这是从渐近意义上说,目前最快实现法。初始化占用时间O(V),对边排序需时间为O(E㏒E);对分离集的森林要进行O(E)次操作,共需时间为O(Ef(E,V)),其中f函数为Ackerman函数的反函数。因f(E,V)=O(㏒E),所以KruskaI全部运行时间为O(E㏒E)。
/*********************Kruskal算法********************/
void Init_Kruskal_MST(void)
{
count=; //边计数
sum_mst=; //权值和
memset(MST,,sizeof(MST));
qsort(ESA,e,sizeof(ESA[]),myComp); //按权值快速排序
} //注意调用方法 void Kruskal_MST(void)
{
int cn=;
int u,v; while(count < n-) //边数判断
{
u=ESA[cn].from;
v=ESA[cn].to;
// cn++; if(Find(u) != Find(v))
{
MST[count].from=vertex[u];
MST[count].to=vertex[v];
count++;
sum_mst+=ESA[cn].wg;
Union(u,v);
}
cn++; //注意位置
}
}
2.Prime算法
方法:从指定顶点开始将它加入集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树的边,并将集合外的那个顶点加入到集合中,表示该顶点已连通.如此下去直到全部顶点都加入到集合中,即得最小生成树.
① 置顶点集合V和边集E,它们的初始状态为空集。
② 任意选取一个顶点A加入V中。
③ 复以下过程直到V中已经包含原图的所有节点:
1、选一条权值最小的边(u,v),并使其满足u,v两节点只有一个在点集V中。
2、将两个节点中不在V的那个点加入集合V中,并将边(u,v)加入边集E中。
④ 所得的子图G’=(V,E)即为所求的最小生成树。
任意时刻的中间结果都是一棵树,每次花费最小的代价,用一条边把不在树中的结点加进来。按结点来贪,因此适用于稠密图的处理. 关键:找出当前最优得一条边,穷举每一条不在集合E中的边,找出符合条件且最优的边。邻接矩阵:O(v2) 。
void Init_Prime_MST(void)
{
flag=;
sum_mst=;
count=;
for(int i=;i<MG->n;i++)
{
vis[i]=;
min_wg[i]=MG->edge[START][i]; //记录以i为终点的最小权值
min_from[i]=START; //记录最小权值边的起点
}
count=; //默认第一个节点[编号0]已选【可以更改】
vis[START]=;
min_from[START]=START;
} void Prime_MST(void)
{
int min,to_index; //权值中间量,对应的到达顶点索引index while(count < MG->n)
{
min=INF;
to_index=-;
for(int i=;i<MG->n;i++)
if(!vis[i] && (min_wg[i] < min))
{
min=min_wg[i];
to_index=i;
} if(to_index != -) //找到终点
{
vis[to_index]=;
sum_mst+=min;
MST[count-].from=MG->vertex[min_from[to_index]];
MST[count-].to=MG->vertex[to_index];
count++; if(count == MG->n)
flag=;
}
else
break; for(int j=;j<MG->n;j++) //更新dist,使不在生成树上的点到生成树上的点的距离最小,直到所有的点都在生成树上。
if(!vis[j] && (min_wg[j] > MG->edge[to_index][j]))
{
min_wg[j]=MG->edge[to_index][j]; /* 更新权值信息 */
min_from[j]=to_index; /* 更新最小权值边的起点 */
}
}
}
最小生成树---Kruskal/Prime算法的更多相关文章
- 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)
一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...
- 最小生成树(Prime算法)
最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城 ...
- 最小生成树之prime算法
public class Prime { public static void main(String[] args) { //路径矩阵 int arcs[][] = {{-1,6,1,5,-1,-1 ...
- poj 1258 Agri-Net【最小生成树(prime算法)】
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44827 Accepted: 18351 Descri ...
- hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 最小生成树之算法记录【prime算法+Kruskal算法】【模板】
首先说一下什么是树: 1.只含一个根节点 2.任意两个节点之间只能有一条或者没有线相连 3.任意两个节点之间都可以通过别的节点间接相连 4.除了根节点没一个节点都只有唯一的一个父节点 5.也有可能是空 ...
- 最小生成树两个经典算法(Prime算法、Kruskal算法) - biaobiao88
经典的最小生成树例子,Prime算法,具体的步骤及其注释本人均在代码中附加,请仔细阅读与品味,要求,可以熟练的打出. //Prime算法基础 #include<iostream> usin ...
- 51 nod 1212 无向图最小生成树(Kruckal算法/Prime算法图解)
1212 无向图最小生成树 N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 收起 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N < ...
- 最小生成树的Prim算法以及Kruskal算法的证明
Prime算法的思路:从任何一个顶点开始,将这个顶点作为最小生成树的子树,通过逐步为该子树添加边直到所有的顶点都在树中为止.其中添加边的策略是每次选择外界到该子树的最短的边添加到树中(前提是无回路). ...
随机推荐
- 06- Shell脚本学习--其它
Shell输入输出重定向 Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出 ...
- 3D打印:三维智能数字化创造(全彩)
3D打印:三维智能数字化创造(全彩)(全球第一本系统阐述3D打印与3D智能数字化的专业著作) 吴怀宇 编 ISBN 978-7-121-22063-0 2014年1月出版 定价:99.00元 42 ...
- KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定
本节目录: 一个例子 API 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, w ...
- 18.实现如下类之间的继承关系,并编写Music类来测试这些类。
package zhongqiuzuoye; public class Instrument { public void play() { System.out.println("弹奏乐器& ...
- JavaScript与有限状态机
有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物. 简单说,它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. ...
- 你的 mixin 兼容 ECMAScript 5 吗
原文:Are your mixins ECMAScript 5 compatible? 作者:Nicholas C. Zakas 我最近在与客户合作的项目中,需要充分利用的 ECMAScript 5, ...
- 【博客美化】08.添加"扩大/缩小浏览区域大小" 按钮
博客园美化相关文章目录: [博客美化]01.推荐和反对炫酷样式 [博客美化]02.公告栏显示个性化时间 [博客美化]03.分享按钮 [博客美化]04.自定义地址栏logo [博客美化]05.添加Git ...
- CSS布局(上)
CSS布局(上) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !import ...
- vc++用ADO方式连接oracle问题
今天装了个oracle客户端,准备写个访问远程oracle的程序.用的是vs2010,采用ADO的连接方法连接oracle,结果运行的时候总是报下面的错: 从提示可以看出是没有找到OraOLEDBup ...
- (转)JS模块化编程之AMD规范
模块的规范 原文地址 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有 ...