這幾天做的幾套模擬題都要用最小生成樹搞~忘得都差不多的我特地來打兩個板子。
首先,二者均採用貪心策略。
演算法過程:大概是不斷從未知集合往已知集合加元素。
感性理解:對於一顆樹中的節點(u,v),如果二者間的邊權w1小於u->v路徑中的邊權w2,顯然斷開w2連線w1更優,這時我們證明了對於max(u->v)v路徑上的邊都是最小的,即不存在更優解,那麼貪心得到的解即是最優解。
#includeusing namespace std;
#define inc(i,l,r) for(register int i=(l);i<=(r);++i)
const int n = 1010,maxe=n*(n-1)/2;
struct edge
}e;struct node);
while(!q.empty()));
} }};
#includeusing namespace std;
#define inc(i,l,r) for(register int i=(l);i<=(r);++i)
const int n = 510,m = 3e5+10;
struct edge
};struct mst;
} }inline int getfa(int u)
inline void kruskal()
}};
比較prim和kruskal演算法,前者是針對點,後者是對於邊。
那麼,prim顯然更加適合稠密圖,kruskal則對於稀疏圖更優。
順帶一提:我的prim寫法為了和較大資料規模搞,用的優先佇列+鄰接表,於是時間複雜度(n+m)logm,實際上,可以用鄰接矩陣儲存保證嚴格n^2。
最小生成樹MST演算法(Prim Kruskal)
1 概念 乙個有 n 個結點的連通圖 的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊,所謂乙個帶權圖的最小生成樹,就是原圖中邊的權值最小的生成樹,所謂最小是指邊的權值之和小於或者等於其它生成樹的邊的權值之和。2 性質 3 應用 例如 要在n個城市之間鋪設光纜...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
最小生成樹
package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...