kruscal求最小生成樹用到的知識:圖的邊的結構體、按邊權排序、並查集(不產生迴路)
但是這道題仍然需要精心思考,原因是有一些邊是「已經存在的」,那麼在計算最小生成樹成本的時候應該只考慮未修成的邊。
要注意兩個易錯點: ① 多組資料,並查集father陣列要初始化,一些全域性陣列要初始化。 ② 由於有些邊已經存在,要先對已存在的邊進行並查集的處理,否則在邊權排序的時候它排到後面去了,你在生成最小生成樹的時候就不曉得還以為沒有迴路其實有!
注:有可能沒有最小生成樹,判斷方法:看有多少個並查集(father[i]==i),有多個則說明沒有建成最小生成樹。
#include#includeusing namespace std;
//就是求最小生成樹
struct edge
e[1005];
bool cmp(edge a,edge b)
cnt--;
int count=0; //最小生成樹中的邊的條數
int ans=0;//需要花多少錢
sort(e+1,e+1+cnt,cmp); //按邊權從小到大排列邊
for(int i=1;i<=cnt && count
cout<
} return 0;
}
Kruscal演算法 最小生成樹
kruscal演算法是加邊。記錄每條路的權值,然後每次都選擇權值最小的邊加入集合,同時選中的每條邊的兩個點也用並查集合並,直到所有的點都被加入了,就是最小生成樹。時間複雜度只和邊有關係,o e loge hihocoder1098 include include include include in...
模板 最小生成樹(kruscal)
洛谷p3366 其中所應用的並查集原理請見 這裡選用kruscal的方法 先將每乙個點用並查集記錄它們的祖先,用fa i 來表示 然後將邊按照權重,從小到大排序,這裡選用sort的cmp。然後,從小到大遍歷邊權,如果遍歷到一條邊的所連的兩個結點不在同一集合,就將這兩個點連上,ans g i val即...
最小生成樹二 Kruscal演算法
還是直接看輸入輸出 輸入每個測試點 輸入檔案 有且僅有一組測試資料。在一組測試資料中 第1行為2個整數n m,表示小hi擁有的城市數量和小hi篩選出路線的條數。接下來的m行,每行描述一條路線,其中第i行為3個整數n1 i,n2 i,v i,分別表示這條路線的兩個端點和在這條路線上建造道路的費用。對於...