最小生成树

Posted Nipuream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小生成树相关的知识,希望对你有一定的参考价值。

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中找到的集合如果是一棵树,那么这两个顶点连接起来,则是一个圈,显然不符合我们的要求,如果是两颗树,那么,我们将其合并成一棵树。

以上是关于最小生成树的主要内容,如果未能解决你的问题,请参考以下文章

利用普里姆算法求解最小生成树,写出步骤或画图表示过程。

C++用Prim算法实现无向图最小生成树

最小生成树—— Prim算法

最小生成树之prim算法java代码模板

模拟赛T2 中继系统

hdu 1863 畅通project kruskal || prim