$P2121 拆地毯$

\(problem\)

\(kruskal\)的模板题。

#ifdef Dubug

#endif
#include <bits/stdc++.h>
using namespace std;
typedef long long LL ;
inline LL In() { LL res(0),f(1); register char c ;
	while(isspace(c=getchar())) ; c == '-'? f = -1 , c = getchar() : 0 ;
	while(res = (res << 1) + (res << 3) + (c & 15) , isdigit(c=getchar())) ;
	return res * f ;
}
int n , m , k ;
const int N = 100000 + 5 ;
int fa[N] ;
struct node{
	int u ;
	int v ;
	int w ;
};
node edge[N] ;
LL ans(0) ;
bool cmp(node x,node y) {
	return x.w > y.w ;
}
inline int find(int x) {
	return fa[x] == x ? fa[x] : fa[x] = find(fa[x]) ;
}
inline void merge(int x,int y) {
	fa[find(x)] = find(y) ;
}
inline void kruskal() {
	sort(edge+1,edge+m+1,cmp) ;
	int cnt (0) ;
	for(register int i=1;i<=m;i++) {
		if(find(edge[i].u) == find(edge[i].v)) continue ;
		merge(edge[i].u,edge[i].v) ;
		ans += edge[i].w ;
		if(++cnt == k) return ;
	}
}
signed main() {
	n = In() , m = In() , k = In() ;
	for(register int i=1;i<=n;i++) fa[i] = i ;
	for(register int i=1;i<=m;i++) {
		int u , v , w ;
		u = In() , v = In() , w = In() ;
		edge[i] = node{u,v,w} ;
	}
	kruskal() ;
	cout << ans << endl ;
	return 0 ;
}
posted @ 2019-03-30 15:28  Isaunoya  阅读(120)  评论(0编辑  收藏  举报
TOP