最小生成树(Kruskal算法-边集数组)

以此图为例:
package com.datastruct;
import java.util.Scanner;
public class TestKruskal {
private static class Edge{
public Edge(int begin,int end,int weight){
this.begin = begin;
this.end = end;
this.weight = weight;
}
int begin;
int end;
int weight;
public String toString() {
return "("+begin+", "+end+") -> "+weight;
}
}
private static class Mgraph{
final int MAXEDGE = ; //最大边数
final int MAXVEX = ; //最大顶点数
int numEdges;
int numVertexes;
String vexs[] = new String[MAXVEX]; //顶点数组
Edge edges[] = new Edge[MAXEDGE]; //边集数组
}
public static void CreateMGraph(Mgraph g){
int i;
Scanner scanner = new Scanner(System.in);
System.out.println("输入 顶点数 和边数 ");
g.numVertexes = scanner.nextInt();
g.numEdges = scanner.nextInt();
System.out.println("输入全部顶点:");
for(i=;i<g.numVertexes;i++){
g.vexs[i] = scanner.next();
}
for(i=;i<g.numEdges;i++){
System.out.println("输入边 begin end weight ");
int begin = scanner.nextInt();
int end = scanner.nextInt();
int weight = scanner.nextInt();
g.edges[i] = new Edge(begin,end,weight);
}
}
public static void print(Mgraph g){
int i;
System.out.println("所有顶点:");
for(i=;i<g.numVertexes;i++){
System.out.print(" "+g.vexs[i]);
}
System.out.println("\n所有边:");
for(i=;i<g.numEdges;i++){
System.out.println(g.edges[i].toString());
}
}
public static int Find(int parent[], int f){
while(parent[f] > ){
f = parent[f];
}
return f;
}
public static void sortByWeight(Mgraph g){
Edge temp;
int i,j;
boolean flag = true;
for(i=;i<g.numEdges- && flag;i++){
flag = false;
for(j=g.numEdges-;j>=i;j--){
if(g.edges[j].weight > g.edges[j+].weight){
temp= g.edges[j];
g.edges[j] = g.edges[j+];
g.edges[j+] = temp;
flag = true;
}
}
}
}
public static void MiniSpanTree_Kruskal(Mgraph g){
sortByWeight(g);//先根据权值从小到大排序
int i,j,n,m;
Edge edge[] = g.edges;
int parent[] = new int[g.MAXVEX];
for(i=;i<g.numVertexes;i++){
parent[i] = ;
}
System.out.println("最小生成树:");
for(i=;i<g.numEdges;i++){
n = Find(parent,edge[i].begin);
m = Find(parent,edge[i].end);
if(n != m){
parent[n] = m;
System.out.println(edge[i].toString());
}
}
}
public static void main(String[] args) {
Mgraph g = new Mgraph();
CreateMGraph(g); // 创建图,边集数组形式
print(g); //打印图的基本信息
MiniSpanTree_Kruskal(g); //找到最小生成树
}
}






最小生成树(Kruskal算法-边集数组)的更多相关文章
- 最小生成树kruskal算法、
克鲁斯卡尔(kruskal) //kruskal算法生成最小生成树. //对边集数组Edge结构的定义 typedef struct { int begin; int end; int weight; ...
- 【转】最小生成树——Kruskal算法
[转]最小生成树--Kruskal算法 标签(空格分隔): 算法 本文是转载,原文在最小生成树-Prim算法和Kruskal算法,因为复试的时候只用到Kruskal算法即可,故这里不再涉及Prim算法 ...
- 最小生成树------Kruskal算法
Kruskal最小生成树算法的概略描述:1 T=Φ:2 while(T的边少于n-1条) {3 从E中选取一条最小成本的边(v,w):4 从E中删去(v,w):5 if((v,w)在T中不生成环) { ...
- 求最小生成树——Kruskal算法
给定一个带权值的无向图,要求权值之和最小的生成树,常用的算法有Kruskal算法和Prim算法.这篇文章先介绍Kruskal算法. Kruskal算法的基本思想:先将所有边按权值从小到大排序,然后按顺 ...
- 数据结构之最小生成树Kruskal算法
1. 克鲁斯卡算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个 ...
- 最小生成树——Kruskal算法理解
背景:本文是在小甲鱼数据结构教学视频中的代码的基础上,添加详细注释而完成的.该段代码并不完整,仅摘录了核心算法部分,结合自己的思考,谈谈理解. Prim算法理解: 如图(摘录自小甲鱼教学视频中的图片) ...
- 实验一-最小生成树Kruskal算法
实验名称 最小生成树算法-Kruskal算法 实验目的 1.掌握并查集的合并优化和查询优化: 2.掌握Kruskal算法. 3.能够针对实际问题,能够正确选择贪心策略. 4.能够针对选择的贪心策略,证 ...
- 最小生成树——kruskal算法
kruskal和prim都是解决最小生成树问题,都是选取最小边,但kruskal是通过对所有边按从小到大的顺序排过一次序之后,配合并查集实现的.我们取出一条边,判断如果它的始点和终点属于同一棵树,那么 ...
- 最小生成树Kruskal算法
Kruskal算法就是把图中的所有边权值排序,然后从最小的边权值开始查找,连接图中的点,当该边的权值较小,但是连接在途中后会形成回路时就舍弃该边,寻找下一边,以此类推,假设有n个点,则只需要查找n-1 ...
随机推荐
- TypeScript: Angular 2 的秘密武器(译)
本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...
- 如何优雅的使用RabbitMQ
RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...
- Centos6.5下编译安装mysql 5.6
一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...
- 清空Github上某个文件的历史版本
title: 清空Github上某个文件的历史版本 author: 青南 date: 2015-01-08 16:04:53 categories: [经验] tags: [Github,histor ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的
我们在<服务器在管道中的"龙头"地位>中对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了介绍,为了让读者朋友们对管道中的服务器具有更 ...
- WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...
- 设计模式之创建类模式大PK
创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...
- jquery中的$(document).ready(function() {});
当文档载入时执行function函数里的代码, 这部分代码主要声明,页面加载后 "监听事件" 的方法.例如: $(document).ready( $("a") ...
- 灵魂宝石 bzoj 2663
灵魂宝石(1s 128MB)soulgem [问题描述] "作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形" 我们知道,魔法少女的生命被存放于一个称为灵魂宝 ...
- ObserverPattern(观察者模式)
import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...