最小生成树---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算法的思路:从任何一个顶点开始,将这个顶点作为最小生成树的子树,通过逐步为该子树添加边直到所有的顶点都在树中为止.其中添加边的策略是每次选择外界到该子树的最短的边添加到树中(前提是无回路). ...
随机推荐
- jQuery实现在线文档
1.1.1 摘要 现在,许多网站都提供在线图片和图书阅读的功能,这种方式比下载后阅读来的直观和人性化,要实现该功能涉及到点击处理和图片动态加载. 在接下来的博文中,我们将通过Javascript方式实 ...
- 基于Task的异步模式--全面介绍
今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...
- Linux-磁盘管理小结
这篇博文主要总结了Linux磁盘的一些操作,主要是硬盘的加载,分区(MBR分区和GPT分区),分区的挂载,以及swap分区的加载设置. 基础命令 df查看磁盘分区使用状况 -l //仅显示本地磁盘(默 ...
- bower使用记录
每次做项目的时候都不依赖某一个库来开发,每次需要某一个库的时候都是百度进入库官网再找到下载的库,经常会因为官网的改版更新而在里面绕半天找不到想要的版本号,当然直接去github,CDN 都可以找到需要 ...
- javascript中function 函数递归的陷阱问题
//看下这个递归方法,最后输出的值function fn(i){ i++; if(i<10){ fn(i); } else{ return i; } } var result = fn(0); ...
- hdu4750Count The Pairs(最小生成树找瓶颈边)
/* 题意:就是给你一个图,图的每两个点都有多条路径,每一条路径中都有一条最大边, 所有最大边的最小边(也就是瓶颈边)就是这两点之间的val值!然后给你一个值f, 问有多少个顶点对的val>=f ...
- 一键配置本地yum源
在使用RedHat系统过程中,经常会安装各种包,而包的安装又存在着依赖性的问题,即一个包的安装通常依赖其它很多包的安装.这样,就会相当不便.所幸,RedHat提供了Yum.Yum(全称为 Yellow ...
- 设置让TortoiseGit记住账号和密码
方法一:在"C:\Documents and Settings\Administrator\.gitconfig" 文件 或 "项目/.git/config"文 ...
- Kruskal算法(三)之 Java详解
前面分别通过C和C++实现了克鲁斯卡尔,本文介绍克鲁斯卡尔的Java实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的 ...
- Zepto中文API
原文地址:http://zeptojs.com/ 译文地址:http://www.html-5.cn/Manual/Zepto/ Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, ...