最小生成树Prim算法

来源:互联网 发布:windows桌面文件管理 编辑:程序博客网 时间:2024/05/01 21:36
数据结构使用的是斐波那契堆,复杂度 O(E+VlgV)

  1. package com.eshore.sweetop.mintree;
  2. import com.eshore.sweetop.exdataframe.FibHeap;
  3. public class Prim {
  4.     
  5.     public void mst(Graphics g, Vertex r) {
  6.         for (Vertex u : g) {
  7.             u.setKey(Integer.MAX_VALUE);
  8.             u.setParent(null);
  9.         }
  10.         r.setKey(0);
  11.         FibHeap fh = new FibHeap();
  12.         for (Vertex u : g) {
  13.             u.setCont(true);
  14.             fh.insert(u);
  15.         }
  16.         
  17.         while(fh.min()!=null){
  18. //          System.out.println("======root=======");
  19. //          fh.displayRoot();
  20. //          System.out.println("==============");
  21.             System.out.println(((Vertex)fh.min()).getPath());
  22.             Vertex u=(Vertex)fh.extractMin();
  23. //          System.out.println(u.getId());
  24.             u.setCont(false);
  25.             for (Vertex v : u.getList().keySet()) {
  26. //              System.out.println(v.getId()+":"+v.getKey());
  27.                 if(
  28. //                      v.getKey()>=fh.min().getKey()
  29.                         v.isCont()
  30.                         && u.getList().get(v).intValue()<v.getKey()){
  31. //                  v.setParent(u);
  32. //                  v.setKey(u.getList().get(v).intValue());
  33. //                  System.out.println(u.getId()+" "+v.getId()+"="+u.getList().get(v).intValue());
  34.                     v.setPath(""+u.getId()+"->"+v.getId());
  35.                     fh.decereaseKey(v, u.getList().get(v).intValue());      
  36.                 }
  37.             }
  38.         }
  39.     }
  40.     public static void main(String[] args) {
  41.         Vertex a=new Vertex('a');
  42.         Vertex b=new Vertex('b');
  43.         Vertex c=new Vertex('c');
  44.         Vertex d=new Vertex('d');
  45.         Vertex e=new Vertex('e');
  46.         Vertex f=new Vertex('f');
  47.         Vertex g=new Vertex('g');
  48.         Vertex h=new Vertex('h');
  49.         Vertex i=new Vertex('i');
  50.         a.getList().put(b, 4);
  51.         a.getList().put(h, 8);
  52.         b.getList().put(a, 4);
  53.         b.getList().put(h, 11);
  54.         b.getList().put(c, 8);
  55.         c.getList().put(b, 8);
  56.         c.getList().put(i, 2);
  57.         c.getList().put(f, 4);
  58.         c.getList().put(d, 7);
  59.         d.getList().put(c, 7);
  60.         d.getList().put(f, 14);
  61.         d.getList().put(e, 9);
  62.         e.getList().put(d, 9);
  63.         e.getList().put(f, 10);
  64.         f.getList().put(e, 10);
  65.         f.getList().put(d, 14);
  66.         f.getList().put(c, 4);
  67.         f.getList().put(g, 2);
  68.         g.getList().put(f, 2);
  69.         g.getList().put(i, 6);
  70.         g.getList().put(h, 1);
  71.         h.getList().put(g, 1);
  72.         h.getList().put(a, 8);
  73.         h.getList().put(b, 11);
  74.         h.getList().put(i, 7);
  75.         i.getList().put(h, 7);
  76.         i.getList().put(c, 2);
  77.         i.getList().put(g, 6);
  78.         Graphics gph=new Graphics(a,b,c,d,e,f,g,h,i);
  79.         
  80.         Prim p=new Prim();
  81.         p.mst(gph,c);
  82.         
  83.     }
  84.     
  85. }