最小生成樹的演算法主要有兩種kruskal演算法和prim演算法;kruskal演算法是通過逐個找短的邊來去找點,最後實現最小生成樹;而prim演算法是由先確定一點去找邊,再通過點去找短邊來實現最小生成樹的。
kruskal演算法:先將所有的邊進行從小到大排序,從短邊開始找,若邊的兩個點還沒有相連則這個邊可以使用加入生成樹,若兩點已經相連則這個邊不再使用,繼續下一遍;因共有n個點,當找夠n-1條邊時說明n個點已經全部連線到一起了,又因為是從短邊開始查詢的,所以找到的一定是最小生成樹。對於如何判斷兩個點是否已經相連,kruskal演算法中是運用的並查集演算法來進行判斷。定義乙個陣列f[ ]用來儲存它們的祖先,也就是哪個點與它們相連,剛開始因所有點都未連線,所以f[ ]陣列中儲存的祖先都是他們自己,當兩個點的祖先不相等時說明兩個點還為相連,邊就可是使用;邊使用後兩個點相連則f[t1]=t2;即把t1的祖先變為t2,t1、t2是呼叫了乙個遞迴函式查詢到的點的祖先;因為相連的點的祖先都為乙個,從而可以判斷出兩個點是否已經相連,從而實現kruskal演算法實現最小生成樹。
模板題n個點m條邊:
#include#include#includeusing namespace std;
int f[100010];
struct nate
q[1000010];
int cmp(struct nate a,struct nate b)
} printf("%d\n",sum);
} return 0;
}
最小生成樹Prim演算法理解
mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...
最小生成樹Prim演算法理解
mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...
最小生成樹Prim演算法理解
mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...