一.简介
连通图:任意2节点之间都有路径相通
最小生成树:最小权重生成树
一个 n 结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边(n-1)。 最小生成树可以用prim(普里姆)算法或kruskal(克鲁斯卡尔)算法求出。
二.实现
该图的最小生成树权值和为:19
1.普里姆算法
设T为最小生成树集合,V为节点集合,U为还未放入T集合的节点集合(U=V-T)
1.先选取任意节点放入T
2.获取T 与 U 集合中最小权值节点v’,并加入T集合
3.循环2直到集合T中有n-1条边
2.克鲁斯卡尔算法
按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路(不让新选择边的2节点再次被选择)。
package com.vincent;
import java.util.*;
public class Main {
//定义边
static class Edge{
int vertex1;
int vertex2;
int weight;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Edge edge = (Edge) o;
return vertex1 == edge.vertex1 &&
vertex2 == edge.vertex2;
}
@Override
public int hashCode() {
return Objects.hash(vertex1, vertex2);
}
@Override
public String toString() {
return String.format("(%d,%d,%d)",vertex1,vertex2,weight);
}
}
public static void main(String[] args) throws Exception {
char[] datas = {
'a','b','c','d','e'