最近学习算法分析与设计,说真的还挺好的,虽然理论啊上不是很清楚,但是我很欣喜里面的思想。俗话说思想有多远就能走多远。呵呵,努力搞好吧!加油!废话不多说还是把代码贴上来吧:
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;
}
}
分享到:
相关推荐
利用Kruskal算法,用C语言编写出给定无向连通加权图G,构造一棵最小生成树的程序。
prim算法 Kruskal算法分别实现最小生成树
3. JAVA实现:使用JAVA语言实现Kruskal算法,通过PriorityQueue和ArrayList等数据结构,实现高效的边排序和树构建。 算法步骤: 1. 读取图的边信息,并将其存储在Edge数组中。 2. 使用PriorityQueue对边进行排序...
### Kruskal算法求最小生成树的Java实现 #### 一、Kruskal算法简介 Kruskal算法是一种用于寻找图中的最小生成树(Minimum Spanning Tree, MST)的算法。最小生成树是指在一个加权无向图中,连接所有顶点形成的树,...
在详细设计和编码功能模块图中,我们还对每个功能模块的实现进行了详细的描述,例如insertsort函数的实现使用了插入排序算法,而Kruskal函数的实现使用了Kruskal算法。 最后,我们对上机调试过程进行了描述,包括了...
在这个问题中,Prim算法和Kruskal算法是两种常用的方法。 1. Prim算法: Prim算法是一种贪心策略,它从一个起始顶点开始,逐步添加边,每次添加一条与已选择顶点集形成最小权重边的新边。这个过程不断进行,直到...
在Java中实现Kruskal算法,通常包括以下几个关键部分: - **定义Edge类**:表示图中的边,包含两个端点和一个权重。 - **定义UnionFind类**:实现并查集,包括查找、联合等操作。 - **构建图**:读取图的信息,可以...
**Kruskal算法** 是基于**并查集**的数据结构来实现的。算法的主要步骤如下: 1. 将图中的所有边按照权重从小到大排序。 2. 初始化一个空的边集合,用来存储最小生成树的边。 3. 遍历排序后的边,对于每一条边 (u, ...
在Java中实现Kruskal算法,主要分为以下几个步骤: 1. **初始化**:首先,我们需要将图中的所有边按照权重从小到大排序。可以使用优先队列(如Java的`PriorityQueue`)来完成这个任务,因为我们需要频繁地取出最小...
2. 算法分析:详细介绍Kruskal算法的原理、步骤和实现方法,可能还包括时间复杂度和空间复杂度的分析。 3. 程序设计:阐述计算器程序的设计思路,包括数据结构的选择、函数模块划分和算法实现。 4. 测试案例:展示...
**Kruskal 算法简介** Kruskal 算法是一种用于解决图论中的最小生成树问题的算法,由约瑟夫·克拉斯基尔(Joseph Kruskal)于1956年提出。该算法的核心思想是按边的权重从小到大依次选择边,并确保在选择过程中不...
在这个问题中,我们关注的是如何利用Java编程语言,结合Kruskal算法来解决最小生成树的问题,并且从文件中读取数据来实现这一过程。 Kruskal算法是一种贪心算法,其基本思想是按照边的权重从小到大依次考虑,每次...
学生需要掌握图的基本概念,如顶点、边、邻接矩阵和邻接表等,并能用C++或Java等编程语言实现Kruskal算法。同时,要对算法的正确性和效率进行验证,并撰写详细的报告。 2. 课程设计原理 2.1 课设题目粗略分析 ...
现在,结合"DSFGraph并用kruskal算法求最小生成树"这个文件名,我们可以推测这是一个关于使用深度优先搜索(DFS)辅助实现Kruskal算法的例子。深度优先搜索通常用于遍历或搜索图,但在这里,可能是为了在构建并查集...
经典算法解决最小生成树问题,清晰易懂的源代码,Java语言实现的。
带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现, 有注释,简单...
#### 三、Java实现细节 1. **数据结构定义**: - `Edge`类用来表示图中的边,其中包含起始顶点`start`、终止顶点`end`和边的权重`cost`。 - 使用`ArrayList<Edge>`来存储所有的边以及最终构成最小生成树的边集。 ...
Kruskal 算法的 Java 实现。克鲁斯卡尔算法的具体思路是:将所有边按照权值的大小进行升序排序,然后从小到大一一判断,条件为:如果这个边不会与之前选择的所有边组成回路,就可以作为最小生成树的一部分;反之,...
【标题】"POJ 1679 练习克鲁斯卡尔Kruskal算法" 在图论领域,克鲁斯卡尔(Kruskal)算法是一种用于解决最小生成树问题的有效方法。这个问题涉及到在一个加权无向图中找到一棵包括所有顶点的树,其边的权重之和尽...
【Kruskal算法详解及其Java实现】 Kruskal算法是一种用于解决图论中的最小生成树问题的经典算法。在图中,最小生成树是指一个连通子图,它包含图中的所有顶点,并且边的权重之和尽可能小。Kruskal算法通过按权重...