最小生成樹

2021-09-01 11:37:06 字數 1332 閱讀 7612

最小生成樹是怎麼用最短的路徑把圖所有的結點給連起來。

這裡有兩種方式,一種是kruskal方法,簡稱k方法,另一種是prim方法,簡稱p方法。

k方法:是根據最小權重的邊來算的,通過乙個優先順序佇列來存放所有的邊,權值最小的在隊尾。優先順序佇列其實就是最大堆和最小堆,看你傳進去的比較器是按什麼方式排列的。通過乙個並查集來存放所有的結點,並查集是看兩個元素是否是乙個集合和把兩個集合合併成乙個集合的功能。關於並查集可以看我另一篇文章。再通過乙個set來確認邊是否已經加入。每次取出最小的邊,看邊的兩頭結點是否是乙個集合,若不是就把邊加入set,在把這兩個結點通過並查集合並成乙個集合。若是乙個集合就從佇列裡再取出一條邊來計算。**如下所示:

public class kruskalmst 

private node findfather(node n)

fathermap.put(n, father);

return father;

} public void makesets(collectionnodes)

} public boolean issameset(node a, node b)

public void union(node a, node b)

node afather = findfather(a);

node bfather = findfather(b);

if (afather != bfather) else

}} }

//比較器

public static class edgecomparator implements comparator }

public static setkruskalmst(graph graph)

setresult = new hashset<>();

while(!priorityqueue.isempty())

} return result;

}}

p演算法:主要是根據結點來算的,首先得到乙個結點和他所有的邊,把結點放進set裡,邊放進優先順序佇列裡,取出最小權值的邊,看邊的指向的結點是否在set裡,不在就把結點放進set裡,同時把這條邊放進另乙個set裡,把這個結點的邊放進優先順序佇列裡,**如下所示:

public class prim 	}	

public static setprimmst(graph graph)

while(!priorityqueue.isempty()) }}

}} return result;

}}

關於圖的結構可看我另一篇關於圖的生成和深度寬度優先遍歷的文章。

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...