`
潇潇暮雨
  • 浏览: 29241 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Kruskal 算法的Java实现

阅读更多

      最近学习算法分析与设计,说真的还挺好的,虽然理论啊上不是很清楚,但是我很欣喜里面的思想。俗话说思想有多远就能走多远。呵呵,努力搞好吧!加油!废话不多说还是把代码贴上来吧:

package com.sfsj.chap3;

import java.util.ArrayList;
import java.util.List;

/**
 * 输入一个带权的连通无向图 生成该图的最小生成树 该类实现kruskal算法 该算法以边为主 适用于边多点少的图形中
 *
 * @author lxy
 */
public class Kruskal {
 /**
  * 代表字符的数字 A-0, B-1, C-2, D-3 ,E-4
  */
 // 当两个顶点没有连线的时候将其权值设为MOUSTMAX
 private static final int MOUSTMAX = 1000;
 // 保存点集的第一个集合
 private static List<String> START = new ArrayList<String>();
 // 保存点集的第二个集合
 private static List<String> END = new ArrayList<String>();

 /**
  * 程序的入口
  *
  * @param args
  */
 public static void main(String[] args) {
  // 声明一个二维数组保存边的权值
  int[][] array = new int[5][5];
  // 给二维数组全部赋值
  for (int i = 0; i < array.length; i++) {
   for (int j = 0; j < array.length; j++) {
    array[i][j] = MOUSTMAX;
   }
  }
  // 输入边的权值
  array[0][2] = 200;// AC权值为200
  array[0][3] = 80;// AD权值为80
  array[0][4] = 50;// AE权值为50
  array[1][2] = 70;// BC权值为70
  array[1][3] = 75;// BD权值为75
  array[1][4] = 300;// BE权值为300
  array[2][3] = 60;// CD权值为60
  array[3][4] = 90;// DE权值为90
  // 边的条数
  int count = 0;

  for (int i = 0; i < array.length; i++) {
   for (int j = 0; j < array.length; j++) {
    if (array[i][j] != MOUSTMAX) {
     count++;
    }
   }
  }
  // 调用排序
  while (count > 0) {
   Kruskal.sort(array);
   count--;
  }
 }

 /**
  * @param array
  *            带权值的二维数组
  */
 public static void sort(int[][] array) {
  int min = array[0][0];
  // 找到当前二维数组中最小的值
  for (int i = 0; i < array.length; i++) {
   for (int j = 0; j < array.length; j++) {
    if (array[i][j] <= min) {
     min = array[i][j];
    }
   }
  }

  // 定义两个变量存储相应坐标,二维数组中有array[0][0]所以如下定义
  int varx = Integer.MAX_VALUE;
  int vary = Integer.MAX_VALUE;
  // 将最小处的值改变
  for (int i = 0; i < array.length; i++) {
   for (int j = 0; j < array.length; j++) {
    if (array[i][j] == min) {
     array[i][j] = MOUSTMAX;
     varx = i;
     vary = j;
     break;
    }
   }
  }
  // 将数字转化成字符
  String charx = Kruskal.tochar(varx);
  String chary = Kruskal.tochar(vary);
  // 判断是否有环路
  List<String> laststring = Kruskal.dest(charx, chary);

  for (String i : laststring) {
   System.out.print(i + " ");
  }
 }

 public static List<String> dest(String charx, String chary) {
  List<String> last = new ArrayList<String>();
  // 初始点集为空时
  if (END.size() == 0) {
   last.add(charx + chary);
   END.add(charx);
   END.add(chary);
  } else {
   // 边的坐标并不全在两个点集中的任何一个点集中
   if (!(END.contains(charx) && END.contains(chary) || START
     .contains(charx)
     && START.contains(chary))) {
    // 如果 某点在一个点集中,另一个点在另一个点集中
    if (END.contains(charx) && START.contains(chary)) {
     last.add(charx + chary);
     // 构成新的点集
     for (String char1 : START) {
      if (!END.contains(char1)) {
       END.add(char1);
      }
     }
     START.clear();
    }
    if (START.contains(charx) && END.contains(chary)) {
     last.add(charx + chary);
     for (String char1 : START) {
      if (!END.contains(char1)) {
       END.add(char1);
      }
     }
    }
    // 如果两点都不在某点集中,那么添加另外一个集合保存新的点集
    if (!END.contains(charx) && !END.contains(chary)) {
     last.add(charx + chary);
     if (!START.contains(charx) && !START.contains(chary)) {
      START.add(charx);
      START.add(chary);
     }
     if (START.contains(charx) && !START.contains(chary)) {
      START.add(chary);
     }
     if (!START.contains(charx) && START.contains(chary)) {
      START.add(charx);
     }
    }
   }
  }

  return last;
 }

 /**
  *
  * @param var
  *            代表字符的数字
  * @return 返回该字符
  */
 public static String tochar(int var) {
  String char1 = "";
  switch (var) {
  case 0:
   char1 = "A";
   break;
  case 1:
   char1 = "B";
   break;
  case 2:
   char1 = "C";
   break;
  case 3:
   char1 = "D";
   break;
  case 4:
   char1 = "E";
   break;
  }
  return char1;
 }

}

 

分享到:
评论
5 楼 hyneng 2010-10-13  
算法学习有什么资源或书推荐吗
4 楼 潇潇暮雨 2009-09-29  
yuanji200603 写道
这个循环的条件count>0感觉也有问题,不是边取完了 就结束啊,是顶点 取完 结束

Kruskal算法是针对于点少边多的情况的,我个人认为Kruskal是针对于边的,而不是针对于顶点,prm算法是针对于顶点!
3 楼 潇潇暮雨 2009-09-29  
yuanji200603 写道
问一下,如果只有5个点的话,上面的两个点集是可以的,但是如果有很多点集呢。

恩这个问题是还没有解决的,我也在看书在查找相关资料
2 楼 yuanji200603 2009-09-25  
这个循环的条件count>0感觉也有问题,不是边取完了 就结束啊,是顶点 取完 结束
1 楼 yuanji200603 2009-09-25  
问一下,如果只有5个点的话,上面的两个点集是可以的,但是如果有很多点集呢。

相关推荐

    Kruskal算法的实现

    利用Kruskal算法,用C语言编写出给定无向连通加权图G,构造一棵最小生成树的程序。

    最小生成树 prim算法和Kruskal算法实现

    prim算法 Kruskal算法分别实现最小生成树

    最小生成树Kruskal算法

    3. JAVA实现:使用JAVA语言实现Kruskal算法,通过PriorityQueue和ArrayList等数据结构,实现高效的边排序和树构建。 算法步骤: 1. 读取图的边信息,并将其存储在Edge数组中。 2. 使用PriorityQueue对边进行排序...

    kruskal算法求最小生成树 java

    ### Kruskal算法求最小生成树的Java实现 #### 一、Kruskal算法简介 Kruskal算法是一种用于寻找图中的最小生成树(Minimum Spanning Tree, MST)的算法。最小生成树是指在一个加权无向图中,连接所有顶点形成的树,...

    数据结构课程设计报告最小生成树Kruskal算法

    在详细设计和编码功能模块图中,我们还对每个功能模块的实现进行了详细的描述,例如insertsort函数的实现使用了插入排序算法,而Kruskal函数的实现使用了Kruskal算法。 最后,我们对上机调试过程进行了描述,包括了...

    Prim算法与Kruskal算法求最小生成树

    在这个问题中,Prim算法和Kruskal算法是两种常用的方法。 1. Prim算法: Prim算法是一种贪心策略,它从一个起始顶点开始,逐步添加边,每次添加一条与已选择顶点集形成最小权重边的新边。这个过程不断进行,直到...

    最小生成树:Kruskal(克鲁斯卡尔)算法实现(java)

    在Java中实现Kruskal算法,通常包括以下几个关键部分: - **定义Edge类**:表示图中的边,包含两个端点和一个权重。 - **定义UnionFind类**:实现并查集,包括查找、联合等操作。 - **构建图**:读取图的信息,可以...

    Kruskal算法和prim算法求最小生成树学习小结(JAVA)

    **Kruskal算法** 是基于**并查集**的数据结构来实现的。算法的主要步骤如下: 1. 将图中的所有边按照权重从小到大排序。 2. 初始化一个空的边集合,用来存储最小生成树的边。 3. 遍历排序后的边,对于每一条边 (u, ...

    算法笔记-066Kruskal算法详解(Java)共10页

    在Java中实现Kruskal算法,主要分为以下几个步骤: 1. **初始化**:首先,我们需要将图中的所有边按照权重从小到大排序。可以使用优先队列(如Java的`PriorityQueue`)来完成这个任务,因为我们需要频繁地取出最小...

    课程设计 Kruskal算法和一个计算器程序,内含源代码和设计报告

    2. 算法分析:详细介绍Kruskal算法的原理、步骤和实现方法,可能还包括时间复杂度和空间复杂度的分析。 3. 程序设计:阐述计算器程序的设计思路,包括数据结构的选择、函数模块划分和算法实现。 4. 测试案例:展示...

    apa-kruskal:Kruskal 算法在 Java 中的实现

    **Kruskal 算法简介** Kruskal 算法是一种用于解决图论中的最小生成树问题的算法,由约瑟夫·克拉斯基尔(Joseph Kruskal)于1956年提出。该算法的核心思想是按边的权重从小到大依次选择边,并确保在选择过程中不...

    java从文件中读取数据Kruskal算法解决最小生成树

    在这个问题中,我们关注的是如何利用Java编程语言,结合Kruskal算法来解决最小生成树的问题,并且从文件中读取数据来实现这一过程。 Kruskal算法是一种贪心算法,其基本思想是按照边的权重从小到大依次考虑,每次...

    最小生成树Kruskal算法报告范本模板.docx

    学生需要掌握图的基本概念,如顶点、边、邻接矩阵和邻接表等,并能用C++或Java等编程语言实现Kruskal算法。同时,要对算法的正确性和效率进行验证,并撰写详细的报告。 2. 课程设计原理 2.1 课设题目粗略分析 ...

    kruskal算法求最小生成树

    现在,结合"DSFGraph并用kruskal算法求最小生成树"这个文件名,我们可以推测这是一个关于使用深度优先搜索(DFS)辅助实现Kruskal算法的例子。深度优先搜索通常用于遍历或搜索图,但在这里,可能是为了在构建并查集...

    最小生成树Kruskal算法(经典)

    经典算法解决最小生成树问题,清晰易懂的源代码,Java语言实现的。

    带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离算法,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现,有注释

    带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现, 有注释,简单...

    Kruskal算法

    #### 三、Java实现细节 1. **数据结构定义**: - `Edge`类用来表示图中的边,其中包含起始顶点`start`、终止顶点`end`和边的权重`cost`。 - 使用`ArrayList&lt;Edge&gt;`来存储所有的边以及最终构成最小生成树的边集。 ...

    Kruskal.java

    Kruskal 算法的 Java 实现。克鲁斯卡尔算法的具体思路是:将所有边按照权值的大小进行升序排序,然后从小到大一一判断,条件为:如果这个边不会与之前选择的所有边组成回路,就可以作为最小生成树的一部分;反之,...

    POJ 1679 练习克鲁斯卡尔kruskal 算法

    【标题】"POJ 1679 练习克鲁斯卡尔Kruskal算法" 在图论领域,克鲁斯卡尔(Kruskal)算法是一种用于解决最小生成树问题的有效方法。这个问题涉及到在一个加权无向图中找到一棵包括所有顶点的树,其边的权重之和尽...

    a算法源码java-Kruskal-Algorithm-Java-Source-code:Kruskal算法Java源代码

    【Kruskal算法详解及其Java实现】 Kruskal算法是一种用于解决图论中的最小生成树问题的经典算法。在图中,最小生成树是指一个连通子图,它包含图中的所有顶点,并且边的权重之和尽可能小。Kruskal算法通过按权重...

Global site tag (gtag.js) - Google Analytics