最小生成树(prim算法)

最小生成树

prim(贪心算法)

  • 图的类型:带权连通图
  • 图的存储类型:邻接矩阵
  • 基本思想:
    1>初始化U={v},以v到其他顶点的所有边为侯选边
    2>重复以下步骤n - 1 次
    • 从侯选边中挑选权值最小的边加入U中并用k记录刚加入U中的顶点
    • 考察当前V-U中的顶点j,修改侯选边,若(k,j)的权值小于原来和顶点j关联的侯选边,则用(k,j)的权值取代后者作为侯选边
  • 代码实现:
        public static void prim(MatGraph mg, int v){
          int n = mg.n;
          int [] lowcost = new int [n];
          int [] closest = new int [n];
          int min = INF;//临时存储边与边之间的权值
          int k = 0;//记录最近顶点的编号
          for (int i = 0; i < n; i++) {
              lowcost[i] = mg.edges[v][i];
              closest[i] = v;
      }
          //使 n - 1 个顶点加入到U中
          for (int i = 1; i < n; i++) {
              min  = INF;
              for (int j = 0; j < n; j++) {
                  if (lowcost[j] != 0&&lowcost[j] < min){
                      min = lowcost[j];
                      k = j;
                  }
              }
              System.out.printf("边(%d,%d)权为:%d\n",closest[k],k,min);
              lowcost[k] = 0;//标记k已经加入U中
              for (int j = 0; j < n; j++) {
                  if(lowcost[j] != 0&&mg.edges[k][j] < lowcost[j]){
                      lowcost[j] = mg.edges[k][j];
                      closest[j] = k;//修改数组lowcost和closest
                  }
              }
              }
          }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值