# 图之最小生成树

# 最小生成树

假设图中有N个结点,最小生成树,就是在图中找(N-1)条边,把所有的结点连接起来,同时要保证边的权重和最小

# kruskal算法

  • 将边按权重排序,并且认为所有的点都是孤立的集合
  • 找到权重最小的边,把边的两个点并为一个集合
  • 找到权重第二小的边,判断边的两个点是否已经是同一个集合
    • 是,忽略这个边
    • 否,将边的两个点合并为一个集合
  • 以此找其他的边
public static class EdgeComparator implements Comparator<Edge> {  
	  
   @Override  
   public int compare(Edge o1, Edge o2) {  
      return o1.weight - o2.weight;  
   }  
  
}  
  
public static Set<Edge> kruskalMST(Graph graph) {  
   UnionFind unionFind = new UnionFind();  
   unionFind.makeSets(graph.nodes.values());  
   
   PriorityQueue<Edge> priorityQueue = new PriorityQueue<>(new EdgeComparator());  
   for (Edge edge : graph.edges) {  
      priorityQueue.add(edge);  
   }  
   Set<Edge> result = new HashSet<>();  
   while (!priorityQueue.isEmpty()) {  
      Edge edge = priorityQueue.poll();  
      if (!unionFind.isSameSet(edge.from, edge.to)) {  
         result.add(edge);  
         unionFind.union(edge.from, edge.to);  
      }  
   }  
   return result;  
}