Kruskal算法-贪心算法
学习之前可以先参考一下别人的视频,这个视频通俗易懂,一下就看会的
链接https://haokan.baidu.com/v?vid=6418405244281706379&pd=bjh&fr=bjhauthor&type=video
正题
废话不多说,我是用java实现的,为了偷懒自己就随便拿一个例子来举例,自己去改成通用版本。
运行结果
代码:
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
MGraph m = new MGraph();
//输入图
m.vertex = new char[]{'A','B','C','D','E','F'};
m.edges = new int[][]{ {0,5,6,4,-1,-1}, {5,0,1,2,-1,-1}, {6,1,0,2,5,3}, {4,2,2,0,-1,4}, {-1,-1,5,-1,0,4}, {-1,-1,3,4,4,0} };
m.e = 10;//本例子中有10条边
m.n = m.vertex.length;
kruskal(m);
}
public static void kruskal(MGraph mgraph) {
//1、首先进行的是对边的转换,就是把边的起点和终点放到数组里面
Edge edge[] = new Edge[mgraph.e];
int t=0;
for (int i = 0; i < mgraph.n; i++) {
for (int j = i; j < mgraph.n; j++) {
if(mgraph.edges[i][j]!=0 && mgraph.edges[i][j]!=-1) {//如果不是自己也不是没有边
edge[t] = new Edge();
edge[t].u = i;
edge[t].v = j;
edge[t].w = mgraph.edges[i][j];
t++;
}
}
}
//2、对边集的排列
// System.out.println("开始:");
// for (Edge e:edge) {
// System.out.println(mgraph.vertex[e.u]+"------->"+mgraph.vertex[e.v]);
// }
Arrays.sort(edge);
// System.out.println("排序后:");
// for (Edge e:edge) {
// System.out.println(mgraph.vertex[e.u]+"------->"+mgraph.vertex[e.v]);
// }
//3、开始进行抓取
int test[] = new int[mgraph.n];//辅助数组,用来判断两个顶点是否连通
for (int i = 0; i < test.length; i++) {//初始化,即每个点首先都是属于自己的
test[i] = i;
}
int j = 0;//用于遍历循环所有的边
int flag = 0;//代表已经找到的边数,当j为n-1时就结束
while(flag<mgraph.n-1) {
int kaitou = test[edge[j].u];//判断一条边的起始节点(开头)
int jieshu = test[edge[j].v];//截至节点(结束)
if(kaitou != jieshu) {//起始和截至节点不一样说明不会成为一个回环
System.out.println((char)(edge[j].u+'A')+"-->"+(char)(edge[j].v+'A'));//加入图中
flag++;
//遍历一下新加入的边加入之前已经选好的集合
int temp = test[edge[j].v];//临时变量
for (int i = 0; i < test.length; i++) {
if(test[i] == temp)
test[i] = test[edge[j].u];
}
test[edge[j].v] = test[edge[j].u];
}
j++;
}
}
}
class MGraph{//图的类
char vertex[];//顶点表格
int edges[][];//邻接矩阵
int n,e;//n是点个数,e是边个数
}
class Edge implements Comparable<Edge>{//边的类
int u;//起始点
int v;//终点
int w;//权值
@Override
public int compareTo(Edge o) {//为了能使用Arrays.Sort()方法
return this.w-o.w;
}
}