Kruskal算法java版
/**
* sample Kruskal.java Description:
* kruskal算法的思想是找最小边,且每次找到的边不会和以找出来的边形成环路,利用一个一维数组group存放当前顶点所在连通图标示(每条最小边,属于一个连通图),直到顶点都找完
* 1.0 YESUN Jul 18,
* 2013 8:48:28 AM Create. ChangeLog:
*/
public class Kruskal { /**
* Description:
*
* @param args
* 1.0 YESUN Jul 18, 2013 8:47:10 AM Create. ChangeLog:
*/
public static void main(String[] args) {
int[][] map = new int[][]{
{0,10,MAX,MAX,MAX,11,MAX,MAX,MAX},
{10,0,18,MAX,MAX,MAX,16,MAX,12},
{MAX,MAX,0,22,MAX,MAX,MAX,MAX,8},
{MAX,MAX,22,0,20,MAX,MAX,16,21},
{MAX,MAX,MAX,20,0,26,MAX,7,MAX},
{11,MAX,MAX,MAX,26,0,17,MAX,MAX},
{MAX,16,MAX,MAX,MAX,17,0,19,MAX},
{MAX,MAX,MAX,16,7,MAX,19,0,MAX},
{MAX,12,8,21,MAX,MAX,MAX,MAX,0}
};
kruskal(map);
} static int MAX = Integer.MAX_VALUE; /**
* Description: by yesun
* @param arcs
* 1.0 YESUN Jul 18, 2013 1:42:42 PM Create.
* ChangeLog:
*/
public static void kruskal(int[][] arcs) {
//顶点个数
int num = arcs.length;
//存放对应顶点所在连通图标识
int[] group = new int[num]; int sum = 0, n1 = 0, n2 = 0;
boolean finished = false;
int groupNum = 1; while(!finished) {
int min = Integer.MAX_VALUE;
//找出所有边中最小值
for(int i = 0; i < num; i++) {
for(int j = i+1; j < num; j++) {
if(arcs[i][j] > 0 && arcs[i][j] < min){
//如果group相同,则表示处理过,不相同或都为0都表示没处理过
if (group[i] != group[j] || (group[i] == 0 && group[j] == 0)) {
min = arcs[i][j];
n1 = i;
n2 = j;
}
}
}
} if(min == Integer.MAX_VALUE){
continue;
} System.out.println(n1 + " ---> " + n2 + " " + min);
sum += min; //找到了最小值,设置连通标记
if(group[n1] == 0 && group[n2] == 0){
group[n1] = groupNum;
group[n2] = groupNum;
groupNum++;
}
else if(group[n1] > 0 && group[n2] > 0) {
int tmp = group[n2];
for(int m = 0; m < group.length; m++){
if(group[m] == tmp){
group[m] = group[n1];
}
}
}
else{
if(group[n1] == 0){
group[n1] = group[n2];
}
else{
group[n2] = group[n1];
}
} for(int i = 0; i < group.length; i++) {
if(group[i] != group[0]){
finished = false;
break;
}
else{
finished = true;
}
} if(finished) {
break;
}
} System.out.println(" sum:"+sum); } }
算法思想:
- 选择最小边,但保证不形成环路,直到所有点都选完
- 保证不形成环路的思路是,利用一个数组group存放每个顶点的连通图标示,当所有的顶点的连通图标识都一样,才算全通路,结束
Kruskal算法java版的更多相关文章
- 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题
常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...
- 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...
- 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...
- 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...
- 常用排序算法--java版
package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...
- 快速排序算法Java版
网上关于快速排序的算法原理和算法实现都比较多,不过java是实现并不多,而且部分实现很难理解,和思路有点不搭调.所以整理了这篇文章.如果有不妥之处还请建议.首先先复习一些基础. 1.算法概念. ...
- 爬山算法 | Java版HA_TSP
嗯哼,今天记录下采用Java编写的爬山算法(Hill Algorithm)求解TSP问题. 爬山算法与其他智能算法类似,是一种用来求解多峰函数最值的算法,爬山算法的基本思想是新解不劣于当前解则转移,否 ...
- A*(也叫A star, A星)寻路算法Java版
寻路算法有非常多种,A*寻路算法被公觉得最好的寻路算法. 首先要理解什么是A*寻路算法,能够參考这三篇文章: http://www.gamedev.net/page/resources/_/techn ...
- 快排算法Java版-每次以最左边的值为基准值手写QuickSort
如题 手写一份快排算法. 注意, 两边双向找值的时候, 先从最右边起找严格小于基准值的值,再从最左边查找严格大于基准base的值; 并且先右后左的顺序不能反!!这个bug改了好久,233~ https ...
随机推荐
- [ASE][Daily Scrum]11.24
今天开会总结了一下第一周的进度,讨论了无限地图的访存方法,做了简单的人员调整, Client的包接收分析与服务器通信这块基本上完成了, 之后Jiafan Zhu会开始和Junbei以及Songtao一 ...
- 用Nifi合并二个API、计算并生成新的API
1. 全景图 2. 合并 根据attribute合并flowfile: 合并 json, 并增加code,message等: 3. 计算方差: 在ExecuteScript里只能用纯pyt ...
- DFD数据流程图
顶层图DFD 0层图 1层图
- LInux iptables学习
作者原文 : http://blog.chinaunix.net/uid-9950859-id-98277.html 要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多 ...
- CLIQUE 聚类算法以及Java实现+多线程
CLIQUE(Clustering In QUEst)是一种简单的基于网格的聚类方法,用于发现子空间中基于密度的簇.CLIQUE把每个维划分成不重叠的区间,从而把数据对象的整个嵌入空间划分成单元.它使 ...
- Node.js学习系列总索引
Node.js学习系列也积累了一些了,建个总索引方便相互交流学习,后面会持续更新^_^! 尽量写些和实战相关的,不讲太多大道理... Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- ...
- js随机点名
定时器案例. <!-- Author: XiaoWen Create a file: 2016-12-08 12:27:32 Last modified: 2016-12-08 12:51:59 ...
- Leetcode 88 Merge Sorted Array STL
合并有序数组 时间复杂度O(m+n) 该算法来自各种算法与数据结构书,写得已经烂得不能再烂了,这个应该是最短的代码了吧,不知如何归类 class Solution { public: void mer ...
- javascript设计模式与开发实践阅读笔记(7)——迭代器模式
迭代器模式:指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...
- 浅入“Block Formatting Context”
本文主要是针对BFC特性的应用,至于什么是BFC,可以参看MDN的简介: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_fo ...