zoukankan      html  css  js  c++  java
  • java数据结构和算法------图(最小生成树Prim)

     1 package iYou.neugle.graph;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 //创建图过程的代码在图的那篇博文中,此处直接使用
     7 public class Prim {
     8     private MyGraph1 graph;
     9     private List<Integer> v = new ArrayList<Integer>();// 待处理集合
    10     private List<Integer> u = new ArrayList<Integer>();// 已处理集合
    11 
    12     public Prim(MyGraph1 graph) {
    13         this.graph = graph;
    14     }
    15 
    16     private void Init() {
    17         for (int i = 0; i < this.graph.getGraph().maxNum; i++) {
    18             v.add(i);
    19         }
    20     }
    21 
    22     // Prim核心方法
    23     public void PrimCore() {
    24         this.Init();
    25         u.add(v.get(0));
    26         v.remove(0);
    27         System.out.println("最小生成树为--------");
    28         int weight = 0;
    29         while (u.size() < this.graph.getGraph().maxNum) {
    30             int minw = Integer.MAX_VALUE;
    31             int v1 = 0, v2 = 0, r = 0;
    32             for (int i = 0; i < this.u.size(); i++) {
    33                 int a = this.u.get(i);
    34                 for (int j = 0; j < this.v.size(); j++) {
    35                     int b = this.v.get(j);
    36                     int currentw = this.graph.getGraph().edge[a][b];
    37                     if (currentw > 0 && currentw < minw) {
    38                         minw = currentw;// 权值
    39                         v1 = a;// 第一条边
    40                         v2 = b;// 第二条边
    41                         r = j;// 在v中待删除元素
    42                     }
    43                 }
    44             }
    45             System.out.println((v1 + 1) + "->" + (v2 + 1));
    46             weight += minw;
    47             this.u.add(v2);
    48             this.v.remove(r);
    49         }
    50         System.out.println("----------------");
    51         System.out.println("最小生成树的权值为: " + weight);
    52     }
    53 
    54     //主函数
    55     public static void main(String[] args) {
    56         MyGraph1 graph = new MyGraph1(5, 0);
    57         graph.CreateMaxtrixGraph(1, 2, 2);
    58         graph.CreateMaxtrixGraph(1, 3, 5);
    59         graph.CreateMaxtrixGraph(1, 5, 3);
    60         graph.CreateMaxtrixGraph(2, 4, 4);
    61         graph.CreateMaxtrixGraph(3, 5, 5);
    62         graph.CreateMaxtrixGraph(4, 5, 2);
    63         graph.OutPutMaxtrixGraph();
    64         Prim prim = new Prim(graph);
    65         prim.PrimCore();
    66     }
    67 }
      1 2 3 4 5 
    1 0 2 5 0 3 
    2 2 0 0 4 0 
    3 5 0 0 0 5 
    4 0 4 0 0 2 
    5 3 0 5 2 0 
    最小生成树为--------
    1->2
    1->5
    5->4
    1->3
    ----------------
    最小生成树的权值为: 12
  • 相关阅读:
    Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题
    OpenCV Mat 只能用静态数组定义时初始化,动态数组赋值给Mat需要逐元素进行. MATLAB,OpenCV,VS混合编程
    【转】Ubuntu 10.10升级显卡驱动后开机动画低分辨率问题
    linux 文件[名]编码
    L337 Speak及国外论坛、IRC常用缩写
    UCS2 手机SMS的PDU编码
    setuid
    【转】CentOS5.5硬盘安装
    SWT CTabFolder 简记
    [转] 程序员的十层楼
  • 原文地址:https://www.cnblogs.com/niuxiaoha/p/4669437.html
Copyright © 2011-2022 走看看