//洛谷p3366
(其中所應用的並查集原理請見
這裡選用kruscal的方法:先將每乙個點用並查集記錄它們的祖先,用fa[i]來表示
然後將邊按照權重,從小到大排序,這裡選用sort的cmp。
然後,從小到大遍歷邊權,如果遍歷到一條邊的所連的兩個結點不在同一集合,就將這兩個點連上,ans+=g[i].val即可。
等連到n-1條邊時,該圖已經成為一顆樹,即輸出答案
#include#include#include
#define maxn 200000 + 10
using
namespace
std;
intn,m,ans,num;
intfa[maxn];
struct
edgeg[maxn];
//記錄邊的資訊:起點,終點,權
void
init()
//並查集預處理
bool
cmp(edge a,edge b)
//用於sort的cmp函式
int find(int
x)//
並查集找祖先
bool
merge(edge a)
return
false;}
//並查集連邊
intmain()
//kruscal操作
if(num==n-1) printf("%d"
,ans);
else printf("
orz"
);
return0;
}
Kruscal演算法 最小生成樹
kruscal演算法是加邊。記錄每條路的權值,然後每次都選擇權值最小的邊加入集合,同時選中的每條邊的兩個點也用並查集合並,直到所有的點都被加入了,就是最小生成樹。時間複雜度只和邊有關係,o e loge hihocoder1098 include include include include in...
最小生成樹二 Kruscal演算法(模板題)
描述 隨著小hi擁有城市數目的增加,在之間所使用的prim演算法已經無法繼續使用了 但是幸運的是,經過計算機的分析,小hi已經篩選出了一些比較適合建造道路的路線,這個數量並沒有特別的大。所以問題變成了 小hi現在手上擁有n座城市,且已知其中一些城市間建造道路的費用,小hi希望知道,最少花費多少就可以...
最小生成樹二 Kruscal演算法
還是直接看輸入輸出 輸入每個測試點 輸入檔案 有且僅有一組測試資料。在一組測試資料中 第1行為2個整數n m,表示小hi擁有的城市數量和小hi篩選出路線的條數。接下來的m行,每行描述一條路線,其中第i行為3個整數n1 i,n2 i,v i,分別表示這條路線的兩個端點和在這條路線上建造道路的費用。對於...