最小生成树之kruskal算法计算机等级考试

文章作者 100test 发表时间 2010:01:02 07:00:04
来源 100Test.Com百考试题网


  1. Kruskal算法

  (1) 算法思想

  K r u s k a l算法每次选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。K r u s k a l算法分e 步,其中e 是网络中边的数目。按耗费递增的顺序来考虑这e 条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。

  初始时没有任何边被选择。边( 1 , 6)是最先选入的边,它被加入到欲构建的生成树中,得到图1 3 - 1 2 c。下一步选择边( 3,4)并将其加入树中(如图1 3 - 1 2 d所示)。然后考虑边( 2,7 ,将它加入树中并不会产生环路,于是便得到图1 3 - 1 2 e。下一步考虑边( 2,3)并将其加入树中(如图1 3 - 1 2 f所示)。在其余还未考虑的边中,(7,4)具有最小耗费,因此先考虑它,将它加入正在创建的树中会产生环路,所以将其丢弃。此后将边( 5,4)加入树中,得到的树如图13-12g 所示。下一步考虑边( 7,5),由于会产生环路,将其丢弃。最后考虑边( 6,5)并将其加入树中,产生了一棵生成树,其耗费为9 9。图1 - 1 3给出了K r u s k a l算法的伪代码。

  (2)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",


相关文章


计算机二级辅导:c_c 内存划分计算机等级考试
最长上升子序列LIS算法实现计算机等级考试
最大化投资回报问题的实现计算机等级考试
最长公共子串问题的实现计算机等级考试
最小生成树之kruskal算法计算机等级考试
最小生成树之Prim算法计算机等级考试
贪心算法在背包中的应用计算机等级考试
汽车加油问题之贪心算法计算机等级考试
C 多继承的二义性计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛