最小生成树

Prim算法

Prim算法是让从单个顶点出发,使其逐步成长,每次成长都是不在树上的边的值中最小者,而找出一个新的顶点加入这个树中。和有向图的Dijkstra算法处理方式非常相似,唯一的区别就是更新的地方。

ArrayList<Edge> Prim(Vertex s){

List<Edge> minTree = new ArrayList<>();

for each Vertex v
{
  v.dist = INFINITY; //设置距离为无穷大
  v.know = false;
}

s.dist = 0;

while(there is an unknow distance vertex){

     Vertex v = smallest unknow distance vertex;
     v.know = true;

      for each Vertex w adjacent to v
         if(!w.know){
           int distance = cost of distance from w to v;
           w.dist = min(w.dist,distance);
           w.pre = v;
           minTree.add(new Edge(v,w));
         }
      }
  return minTree;
}


Kruskal算法

Kruskal的处理方式是将整个无向图当作V个单节点树,每次添加一条边,就将两个树合并成一棵树,算法终止的时候,这个树就是最小生成树。

ArrayList<Edge> kruskal(List<Edge> edges,int numVertices)
{
   DisjSets ds = new DisjSets(numVertices);
   PriorityQueue<Edge> pq = new PriorityQueue<>(edges);
   List<Edge> mst = new ArrayList<>();

   while(mst.size() != numVertices -1)
   {
      Edge e = pq.deleteMin();
      SetType uset = ds.find(e.getu());
      SetType vset = ds.find(e.getv());

      if(uset != vset)
      { 
         mst.add(e);
         ds.union(uset,vset);
      }
   }
   return mst;
}

可以看到,如果从最小边的两个顶点分别从ds中找到的集合如果是一棵树,那么这两个顶点连接起来,则是一个圈,显然不符合我们的要求,如果是两颗树,那么,我们将其合并成一棵树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值