最小生成树
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中找到的集合如果是一棵树,那么这两个顶点连接起来,则是一个圈,显然不符合我们的要求,如果是两颗树,那么,我们将其合并成一棵树。
以上是关于最小生成树的主要内容,如果未能解决你的问题,请参考以下文章