最小生成树Kruskal算法

数据结构使用不相交森林,复杂度 O(ElgV)

  1. package com.eshore.sweetop.mintree;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import com.eshore.sweetop.exdataframe.DisjointSetForest;
  6. public class Kruskal {
  7.     private DisjointSetForest dsf=new DisjointSetForest();
  8.     
  9.     
  10.     public void mst(GraphicsD g){
  11.         List<Edge> list=new ArrayList<Edge>();
  12.         for (VertexD v : g) {
  13.             dsf.makeSet(v);
  14.         }
  15.         Collections.sort(g.getEList());
  16.         for (Edge e : g.getEList()) {
  17.             if(dsf.findSet(e.getV())!=dsf.findSet(e.getY())){
  18.                 list.add(e);
  19.                 dsf.union(e.getV(), e.getY());
  20.             }
  21.         }
  22.         
  23.         for (Edge edge : list) {
  24.             System.out.println(edge.getV().getId()+" "+edge.getY().getId()+" "+edge.getI());
  25.         }
  26.     }
  27.     
  28.     public static void main(String[] args) {
  29.         VertexD a=new VertexD('a');
  30.         VertexD b=new VertexD('b');
  31.         VertexD c=new VertexD('c');
  32.         VertexD d=new VertexD('d');
  33.         VertexD e=new VertexD('e');
  34.         VertexD f=new VertexD('f');
  35.         VertexD g=new VertexD('g');
  36.         VertexD h=new VertexD('h');
  37.         VertexD i=new VertexD('i');
  38.         
  39.         GraphicsD gd=new GraphicsD(a,b,c,d,e,f,g,h,i);
  40.         gd.adde(new Edge(a,b,4));
  41.         gd.adde(new Edge(a,h,8));
  42.         gd.adde(new Edge(b,h,11));
  43.         gd.adde(new Edge(b,c,8));
  44.         gd.adde(new Edge(c,d,7));
  45.         gd.adde(new Edge(c,f,4));
  46.         gd.adde(new Edge(c,i,2));
  47.         gd.adde(new Edge(d,e,9));
  48.         gd.adde(new Edge(d,f,14));
  49.         gd.adde(new Edge(e,f,10));
  50.         gd.adde(new Edge(f,g,2));
  51.         gd.adde(new Edge(g,h,1));
  52.         gd.adde(new Edge(g,i,6));
  53.         gd.adde(new Edge(h,i,7));
  54.         
  55.         Kruskal k=new Kruskal();
  56.         k.mst(gd);
  57.     }
  58. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值