针对于树的最小生成树的问题,可以采用以点或者以边为主的方式生成,前面的krustal算法采用以边为主,而prim算法则采用的是以点为主,俗语有云:萝卜青菜各有所爱!在分析问题的时候,根据不通情况,采用不通的方式,将事半功倍!
下面是java实现代码:
package com.sfsj.chap3;
import java.util.ArrayList;
import java.util.List;
/**
* @author lxy prim算法的实现 输入一带权值的无向连通图 产生改图的最小生成树
*/
public class Prim {
/*
* 使用数字代替字符 A-0,B-1,C-2,D-3,E-4
*/
private static final int MOUSTMAX = 1000;
private static final List<String> START = 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
array[2][0] = 200;// AC权值为200
array[3][0] = 80;// AD权值为80
array[4][0] = 50;// AE权值为50
array[2][1] = 70;// BC权值为70
array[3][1] = 75;// BD权值为75
array[4][1] = 300;// BE权值为300
array[3][2] = 60;// CD权值为60
array[4][3] = 90;// DE权值为90
//默认以A点开始
START.add("E");
//保存权值最小边的坐标
int varx=100,vary=100;
while(true){
int min=1000;
List<Integer> L=new ArrayList<Integer>();
for(int i=0;i<START.size();i++){
if(min>findmin(array, toInt(START.get(i)))){
min=findmin(array, toInt(START.get(i)));
L=findpoint(array, min);
varx=L.get(0);
vary=L.get(1);
}
}
System.out.print(toChar(varx)+toChar(vary)+" ");
//添加新的点到点集中去
if(!START.contains(toChar(varx))){
START.add(toChar(varx));
}
if(!START.contains(toChar(vary))){
START.add(toChar(vary));
}
//当点击中包含所有的点的时候退出循环
if(START.size()==5){
break;
}
}
}
/**
* 找出数组中指定值的坐标并修改值
* @param array
* @param min
* @return
*/
public static List<Integer>findpoint(int[][]array,int min){
List<Integer> L=new ArrayList<Integer>();
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;
L.add(i);
L.add(j);
break;
}
}
}
return L;
}
/**
* 找出以某点为顶点权值最小的边
* @param array 代表权值的数组
* @param point 点代表的数字
* @return
*/
public static int findmin(int[][] array, int point) {
int min = array[0][0];
//找出权值最小边
for (int j = 0; j < array.length; j++) {
if (array[point][j] <= min) {
min = array[point][j];
}
}
return min;
}
/**
* 实现有字符向数值转换
* @param char1
* @return
*/
public static int toInt(String char1) {
int num = Integer.MAX_VALUE;
if ("A".equals(char1)) {
num = 0;
}
if ("B".equals(char1)) {
num = 1;
}
if ("C".equals(char1)) {
num = 2;
}
if ("D".equals(char1)) {
num = 3;
}
if ("E".equals(char1)) {
num = 4;
}
return num;
}
/**
* 实现有数值向字符转变
* @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;
}
}
分享到:
相关推荐
### Prim算法Java实现 #### 背景与概念 Prim算法是一种用于寻找加权无向图中的最小生成树(Minimum Spanning Tree, MST)的经典算法。一个无向加权图由一组顶点和一组边组成,每条边都有一个权重值。在本任务中,...
prim算法 Kruskal算法分别实现最小生成树
本篇文章将重点介绍Prim算法及其Java实现。 #### 二、Prim算法原理 Prim算法是一种贪心算法,其核心思想是从任意一个顶点开始,每次选择与当前已形成的树最近的一个顶点加入到树中,直到所有顶点都被加入为止。...
代码可能使用了某种编程语言,如C++、Java或Python,通过数据结构(如邻接矩阵或邻接表)来表示图,然后应用Prim算法找出最小生成树。如果代码使用了优先队列,那么在每轮迭代中,它会找出当前未加入树的顶点中与树...
本文本采用的是java编写的最小生成树Prim算法,参考书:计算机算法设计与分析
Java编写的prim算法,能够满足相对较少节点的最小生成树生成
- **算法实现**:包括Prim算法的伪代码或者特定编程语言(如C++, Java, Python等)的实现。 - **性能分析**:分析算法的时间复杂度,Prim算法的时间复杂度为O(E log E)或O(E log V),其中E是边的数量,V是顶点的数量...
在这个问题中,Prim算法和Kruskal算法是两种常用的方法。 1. Prim算法: Prim算法是一种贪心策略,它从一个起始顶点开始,逐步添加边,每次添加一条与已选择顶点集形成最小权重边的新边。这个过程不断进行,直到...
代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小...
描述中提到的"NULL"表示没有提供具体的实现细节,但我们可以从标签 "源码 工具" 推测,这个挑战可能涉及到提供一段Java代码来实现Prim算法。通常,一个Java版本的Prim算法会包含以下关键部分: - `Graph` 类:表示...
这里我们将深入探讨标题和描述中提及的“深度优先”和“Prim算法”在生成迷宫中的应用,以及如何实现自动寻路功能。 首先,深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法。在迷宫生成...
java算法分析与设计之最小生成树(prim算法)源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络资源少...
具体代码细节可能包括边类的定义(包含源点、终点和权重),以及Kruskal和Prim算法的函数实现。在`iteye.com`上的博文链接可能提供了更详细的解释和示例。 **工具**: 在实际开发中,这些算法可以用于优化网络设计...
Java实现: ```java public class PrimTree { private static int MAX = Integer.MAX_VALUE; public static int prim(int graph[][], int n) { // ... } public static void main(String[] args) { int ...
最小生成树(Minimum Spanning Tree, MST)是图论...在Java中实现Prim算法,主要涉及图的表示、初始化,以及Prim算法的迭代过程。通过这个过程,可以找到一个加权图的最小生成树,满足连接所有顶点且总权重最小的条件。
而“20531774prim”可能是某种编程语言实现Prim算法的代码示例,例如Java、C++或Python,供学习者参考和实践。 了解和掌握Prim算法不仅可以加深对图论的理解,也有助于解决实际问题,如网络设计、资源分配等,这些...
哈夫曼编码算法与分析(java实现) 哈夫曼编码是一种广泛用于数据文件压缩的十分有效的编码方法,它通过对文件中各个字符出现的频率进行分析,生成各个字符的哈夫曼编码方案。哈夫曼编码的主要思想是通过构造一棵...
Java GUI实现Prim最小生成树算法是一个交互式的图形用户界面,用于演示和理解经典的图论算法——Prim算法。Prim算法是解决网络中寻找最小生成树问题的一种有效方法,它能找出连接所有顶点的边,使得这些边的总权重...
【JAVA实现迷宫游戏】 本项目是一个基于JAVA的迷宫游戏,主要采用了随机Prim算法生成随机迷宫,并利用Swing和AWT包构建图形用户界面(GUI),同时包含了一个手绘的游戏胜利界面。以下是该迷宫游戏的关键知识点: 1...