1. 程式人生 > >學習筆記:最小生成樹算法

學習筆記:最小生成樹算法

rri 重復 兩個 turn log 一個 static ide 不包含

一、普裏姆(Prim)算法

①初始化新圖僅包含原圖中的任意一個頂點,不包含任何邊。

②從原圖中選擇一條權值最小的邊,該邊滿足有且僅有一個頂點在新圖中。將該邊加入新圖。

③重復直至所有頂點都在新圖中,新圖即最小生成樹。

二、克魯斯卡爾(Kruskal)算法

①初始化新圖包含原圖中的所有頂點,不包含任何邊。

②從小到大遍歷原圖中所有邊,若邊中的兩個頂點在新圖中不存在連通路徑,則將其加入新圖。

③遍歷結束後,新圖即最小生成樹。

三、實現

import java.util.TreeMap;
import java.util.TreeSet;

public class MinimumSpanningTree {
    
public static class Edge implements Comparable<Edge> { int u, v, w; public Edge(int u, int v, int w) { this.u = u; this.v = v; this.w = w; } @Override public int compareTo(Edge e) { if (w != e.w) return w - e.w;
else if (u != e.u) return u - e.u; else return v - e.v; } } public static TreeSet<Edge> prim(TreeSet<Integer> V, TreeSet<Edge> E) { TreeSet<Edge> T = new TreeSet<>(); V.remove(V.first()); while (!V.isEmpty())
for (Edge e : E) if (V.contains(e.u) != V.contains(e.v)) { V.remove(e.u); V.remove(e.v); T.add(e); E.remove(e); break; } return T; } public static TreeSet<Edge> kruskal(TreeSet<Integer> V, TreeSet<Edge> E) { TreeSet<Edge> T = new TreeSet<>(); TreeMap<Integer, Integer> comp = new TreeMap<>(); for (Integer v : V) comp.put(v, comp.size()); for (Edge e : E) { if (comp.get(e.u).equals(comp.get(e.v))) continue; for (Integer i : comp.keySet()) if (i != e.u && comp.get(i).equals(comp.get(e.u))) comp.put(i, comp.get(e.v)); comp.put(e.u, comp.get(e.v)); T.add(e); } return T; } }

學習筆記:最小生成樹算法