数据结构使用不相交森林,复杂度 O(ElgV)
- package com.eshore.sweetop.mintree;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import com.eshore.sweetop.exdataframe.DisjointSetForest;
- public class Kruskal {
- private DisjointSetForest dsf=new DisjointSetForest();
- public void mst(GraphicsD g){
- List<Edge> list=new ArrayList<Edge>();
- for (VertexD v : g) {
- dsf.makeSet(v);
- }
- Collections.sort(g.getEList());
- for (Edge e : g.getEList()) {
- if(dsf.findSet(e.getV())!=dsf.findSet(e.getY())){
- list.add(e);
- dsf.union(e.getV(), e.getY());
- }
- }
- for (Edge edge : list) {
- System.out.println(edge.getV().getId()+" "+edge.getY().getId()+" "+edge.getI());
- }
- }
- public static void main(String[] args) {
- VertexD a=new VertexD('a');
- VertexD b=new VertexD('b');
- VertexD c=new VertexD('c');
- VertexD d=new VertexD('d');
- VertexD e=new VertexD('e');
- VertexD f=new VertexD('f');
- VertexD g=new VertexD('g');
- VertexD h=new VertexD('h');
- VertexD i=new VertexD('i');
- GraphicsD gd=new GraphicsD(a,b,c,d,e,f,g,h,i);
- gd.adde(new Edge(a,b,4));
- gd.adde(new Edge(a,h,8));
- gd.adde(new Edge(b,h,11));
- gd.adde(new Edge(b,c,8));
- gd.adde(new Edge(c,d,7));
- gd.adde(new Edge(c,f,4));
- gd.adde(new Edge(c,i,2));
- gd.adde(new Edge(d,e,9));
- gd.adde(new Edge(d,f,14));
- gd.adde(new Edge(e,f,10));
- gd.adde(new Edge(f,g,2));
- gd.adde(new Edge(g,h,1));
- gd.adde(new Edge(g,i,6));
- gd.adde(new Edge(h,i,7));
- Kruskal k=new Kruskal();
- k.mst(gd);
- }
- }