
数学建模最小生成树kruskal算法及各种代码参考模板.doc
20页kruskal算法及代码---含伪代码、c代码、matlab、pascal等代码K r u s k a l算法每次选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中注意到所选取的边若产生环路则不可能形成一棵生成树K r u s k a l算法分e 步,其中e 是网络中边的数目按耗费递增的顺序来考虑这e 条边,每次考虑一条边当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入目录Kruskal算法 1. 算法定义 2. 举例描述Kruskal算法的代码实现 1. 伪代码 2. C代码实现 3. matlab代码实现 4. pascal代码实现Kruskal算法 1. 算法定义 2. 举例描述Kruskal算法的代码实现 1. 伪代码 2. C代码实现 3. matlab代码实现 4. pascal代码实现算法定义 克鲁斯卡尔算法 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。
之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止 举例描述 克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个这里面充分体现了贪心算法的精髓大致的流程可以用一个图来表示这里的图的选择借用了Wikipedia上的那个非常清晰且直观 首先第一步,我们有一张图,有若干点和边 如下图所示: / 第一步我们要做的事情就是将所有的边的长度排序,用排序的结果作为我们选择边的依据这里再次体现了贪心算法的思想资源排序,对局部最优的资源进行选择 排序完成后,我们率先选择了边AD这样我们的图就变成了 第二步,在剩下的变中寻找我们找到了CE这里边的权重也是5 依次类推我们找到了6,7,7完成之后,图变成了这个样子 . 下一步就是关键了下面选择那条边呢? BC或者EF吗?都不是,尽管现在长度为8的边是最小的未选择的边。
但是现在他们已经连通了(对于BC可以通过CE,EB来连接,类似的EF可以通过EB,BA,AD,DF来接连)所以我们不需要选择他们类似的BD也已经连通了(这里上图的连通线用红色表示了) 最后就剩下EG和FG了当然我们选择了EG最后成功的图就是下图: . 到这里所有的边点都已经连通了,一个最小生成树构建完成 编辑本段Kruskal算法的代码实现伪代码 MST-KRUSKAL(G,w) C代码实现 /* Kruskal.c Copyright (c) 2002,2006 by ctu_85 All Rights Reserved. */ /* I am sorry to say that the situation of unconnected graph is not concerned */ #include "stdio.h" #define maxver 10 #define maxright 100 int G[maxver][maxver],record=0,touched[maxver][maxver]; int circle=0; int FindCircle(int,int,int,int); int main() { int path[maxver][2],used[maxver][maxver]; int i,j,k,t,min=maxright,exsit=0; int v1,v2,num,temp,status=0; restart: printf("Please enter the number of vertex(s) in the graph:\n"); scanf("%d",&num); if(num>maxver||num<0) { printf("Error!Please reinput!\n"); goto restart; } for(j=0;j
