首页 > 其他 > 详细

数据结构与算法分析–Minimum Spanning Tree(最小生成树)

时间:2014-03-09 04:28:39      阅读:418      评论:0      收藏:0      [点我收藏+]
1.prim版本的算法
 
   1:  #include<string.h>
   2:  #define INF 10000001
   3:  #define N 10001
   4:  int graph[N][N];                     //夹着我们有N个点,这里存的是边(i,j)的花费(无向边)
   5:  //没有边时的花费就是INF
   6:  int cost[N];                         //记录目前要把第i个点加入正确联盟所需要的花费
   7:  int last[N];                         //记录第i个点是透过谁加入了正确联盟(等于是存在edge(last[i],i))
   8:  int choosed[N];                      //记录是否已经加入正确联盟
   9:  int fin_cnt;                         //记录已经加入正确联盟点的个数
  10:  int total_cost;                      //记录总花费
  11:  void init(){
  12:      int i;
  13:      memset( choosed , 0 , sizeof(int));
  14:      //last = -1代表自己就是root,一开始所有点都是自己的parent
  15:      memset( last , -1 , sizeof(int));
  16:   
  17:      //以idx=0的点作为root开始看花费
  18:      cost[0]=0;
  19:      choosed[0]=1;
  20:      for( i = 1 ; i < N ; i++ ){
  21:          cost[i] = graph[0][i];       //如果有边cost就会是该条边,反之则会是INF
  22:          if( cost[i] != INF)
  23:              last[i] = 0;
  24:      }
  25:      fin_cnt=1;                       //一开始只有一个点在正确联盟
  26:  }
  27:   
  28:  void prim(){            
  29:      int min;                         //用来存这一轮找到的最小花费
  30:      int min_idx;                     //用来存这一轮找到最小花费的是哪个点
  31:      int i;        
  32:      while( fin_cnt < N ){            //如果小于N代表还没找完
  33:          min = INF;                   //初始化成INF,用来找最小值
  34:          min_idx=-1;    
  35:          for( i = 1 ; i < N ; i++ ){  //跑过所有点,找最小值
  36:              if(choosed[i] == 0&&cost[i]<min){//已经在正确联盟里就不考虑
  37:                  min_idx=i;
  38:                  min=cost[i];
  39:              }
  40:          }
  41:          if( min_idx == -1 )          //如果没有找到就代表此图找不到spanning tree
  42:              break;   
  43:   
  44:          choosed[min_idx]=1;          //标记min_idx这个店进入了正确联盟
  45:          total_cost+=cost[min_idx];   //加上加入这个点的cost
  46:          fin_cnt++;                   //fin_cnt增加一,代表多了一个点已经确定
  47:   
  48:          //看看还有没有被选的点,有没有点能够透过min_idx这个点而更近的
  49:          for( i = 1 ; i < N ; i++){
  50:              if(choosed[min_idx] == 0 && graph[min_idx][i]<cost[i]){          //被选过的就跳过,有更近就更新
  51:                  last[i] = min_idx;
  52:                  cost[i] = graph[min_idx][i];
  53:              }
  54:          }
  55:      }
  56:  }

数据结构与算法分析–Minimum Spanning Tree(最小生成树),布布扣,bubuko.com

数据结构与算法分析–Minimum Spanning Tree(最小生成树)

原文:http://www.cnblogs.com/ZJUT-jiangnan/p/3588560.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!