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算法的更多相关文章

  1. 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)

    一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...

  2. 最小生成树(Prime算法)

    最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城 ...

  3. 最小生成树之prime算法

    public class Prime { public static void main(String[] args) { //路径矩阵 int arcs[][] = {{-1,6,1,5,-1,-1 ...

  4. poj 1258 Agri-Net【最小生成树(prime算法)】

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44827   Accepted: 18351 Descri ...

  5. hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  6. 最小生成树之算法记录【prime算法+Kruskal算法】【模板】

    首先说一下什么是树: 1.只含一个根节点 2.任意两个节点之间只能有一条或者没有线相连 3.任意两个节点之间都可以通过别的节点间接相连 4.除了根节点没一个节点都只有唯一的一个父节点 5.也有可能是空 ...

  7. 最小生成树两个经典算法(Prime算法、Kruskal算法) - biaobiao88

    经典的最小生成树例子,Prime算法,具体的步骤及其注释本人均在代码中附加,请仔细阅读与品味,要求,可以熟练的打出. //Prime算法基础 #include<iostream> usin ...

  8. 51 nod 1212 无向图最小生成树(Kruckal算法/Prime算法图解)

    1212 无向图最小生成树 N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 收起 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N < ...

  9. 最小生成树的Prim算法以及Kruskal算法的证明

    Prime算法的思路:从任何一个顶点开始,将这个顶点作为最小生成树的子树,通过逐步为该子树添加边直到所有的顶点都在树中为止.其中添加边的策略是每次选择外界到该子树的最短的边添加到树中(前提是无回路). ...

随机推荐

  1. [算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本

    一.有啥用 这里用的是LIS3DH三轴加速计,输出为X.Y.Z轴的加速度,通过串口连接电脑,电脑里运行matlab脚本通过串口实时获取数据并做可视化显示. 这里虽然是针对LIS3DH的,其实稍作修改即 ...

  2. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  3. js 倒计时实现

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. SiteMesh3整合SpringMVC+FreeMarker

    SiteMesh3配置 添加maven依赖 添加filter 配置servlet 添加sitemesh配置文件 decorator示例 SpringMVC.FreeMarker配置(404问题处理) ...

  5. JS设置cookie、读取cookie、删除cookie

    JS设置cookie.读取cookie.删除cookie       JS设置cookie,注意一定要path=/ ,根目录,不然其他目录可能查询不到..默认是本目录. document.cookie ...

  6. 3 分钟轻松搭建 Ruby 项目自动化持续集成

    任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这是一篇关于 Ruby 项目持续集成的快速指导教程,教大家如何使用 f ...

  7. iOS-性能优化1

      iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象.还记得12306么,那个速度,相信大家都 ...

  8. javascript_core_06之正则、Math、Date

    1.RegExp:Regular Expression,创建封装正则表达式: ①正则直接量:var reg=/reg/ig:②var reg=new RegExp(“reg”,“ig”): 2.Reg ...

  9. Python内建的对象列表

    Python内建的对象列表 刚写Python肯定会遇到这样的情况,想写些什么,但又不知从何写起... 在我看来问题在于我们不知道有什么东东可以拿来玩,这里列出Python的内建对象,稍微归类了一下,多 ...

  10. 第五章 运输层(UDP和TCP三次握手,四次挥手分析)

    序言   通过这章,可以知道其实三次握手和四次挥手其实真的好简单,通过这章的学习,我相信你也会同样的认为,以后在也不需要听到别人问三次握手的过程而自己一脸懵逼了,觉得人家好屌,其实也就是他懂你不懂,仅 ...