最小生成树




class Edge {

     
      char vexa;

     
      char vexb;

     
      int weight;

      Edge(char vexa, char vexb, int weight) {
            this.vexa = vexa;
            this.vexb = vexb;
            this.weight = weight;
      }
}

public class MST {

     
      static Edge[] e = { new Edge('a', 'b', 2), new Edge('b', 'c', 1),
                  new Edge('c', 'd', 2), new Edge('d', 'e', 9),
                  new Edge('e', 'f', 4), new Edge('f', 'g', 1),
                  new Edge('g', 'h', 9), new Edge('h', 'a', 1),
                  new Edge('a', 'i', 8), new Edge('b', 'i', 6),
                  new Edge('c', 'j', 3), new Edge('d', 'k', 7),
                  new Edge('e', 'k', 2), new Edge('f', 'k', 1),
                  new Edge('g', 'j', 4), new Edge('h', 'i', 7),
                  new Edge('i', 'j', 1), new Edge('j', 'k', 6) };

     
      static int w(int x, int y) {
            char from = (char) (x + 97);
            char to = (char) (y + 97);

            for (int i = 0; i < 18; i++) {
                  if (e[i].vexa == from && e[i].vexb == to) {
                        return e[i].weight;
                  }
                  if (e[i].vexa == to && e[i].vexb == from) {
                        return e[i].weight;
                  }
            }
            return 1000; // 用1000代表无穷大,如果图中没有这条边就返回无穷大
      }

      public static void main(String[] args) {

            //Edge[] e_mst = new Edge[10]; // 表示已经加入最小生成树的边

            // 表示已经加入最小生成树(mst)的结点, 数组元素从0到10分别对应结点a到j
            // 如果vex_mst[i]=0,表示对应结点没有加入到mst
            // 如果vex_mst[i]=1,表示对应结点已经加入到mst
            int[] vex_mst = new int[11];

            for (int i = 0; i < 11; i++)
                  // 初始化
                  vex_mst[i] = 0;

            vex_mst[0] = 1; // 设置初始结点为a

            // 将10条边加入到最小生成树
            for (int i = 0; i < 10; i++) {
                  // 加入一条边。
                  // 这条边的两个结点一个在mst中,而另一个不在mst中而且具有最小权植
                  int add_vex = 0; // 选中的结点
                  int min_weight = 1000; // 最小权植,初始值为1000
                  Edge adde = new Edge(' ', ' ', 0);
                  for (int j = 0; j < 11; j++)
                        if (vex_mst[j] == 1) { // j是mst中的结点
                              for (int k = 0; k < 11; k++) {
                                    if (vex_mst[k] == 0 && w(j, k) < min_weight) {
                                          add_vex = k;
                                          min_weight = w(j, k);
                                          adde.vexa = (char) (j + 97);
                                          adde.vexb = (char) (k + 97);
                                          adde.weight = min_weight;
                                    }
                              }
                        }
                  vex_mst[add_vex] = 1; // 将选择的结点加入mst
                  char avex = (char) (add_vex + 97); // 将选择的边加入mst
                  System.out.println("addvex:" + avex);
                  // 输出加入mst的顶点,边,以及边的权植
                  System.out.println("addedge:" + adde.vexa + "-" + adde.vexb + " w:"
                              + adde.weight);
            }
      }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值