传送门:CCF201412-4 最优灌溉
很水的模板题。
不过后来发现了并查集的按秩合并优化,但据说优化效果不咋地,所以这里挖个坑,以后来补。
下面上代码,基本上可以当作kruskal的板子用了:
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e3+10;
const int maxm = 1e5+10;
struct Edge
{
int u, v, w;
bool operator < (const Edge& e) const
{
return w < e.w;
}
}edge[maxm];
int n, m;
int p[maxn];
int ans;
void read()
{
cin >> n >> m;
for(int i = 0; i < m; ++i)
cin >> edge[i].u >> edge[i].v >> edge[i].w;
}
void ufs_init()
{
for(int i = 0; i <= n; ++i)
p[i] = i;
}
int Find(int x)
{
int r = x;
while(p[r] != r)
r = p[r];
int i = x, j;
while(i != r)
{
j = p[i];
p[i] = r;
i = j;
}
return r;
}
void Union(int x, int y)
{
int rx = Find(x), ry = Find(y);
if(rx != ry)
p[rx] = p[ry];
}
void kruskal()
{
sort(edge, edge+m);
for(int i = 0; i < m; ++i)
{
int u = edge[i].u, v = edge[i].v;
if(Find(u) != Find(v))
{
ans += edge[i].w;
if(!(--n))
return;
Union(u, v);
}
}
}
void solve()
{
ufs_init();
kruskal();
cout << ans;
}
int main()
{
read();
solve();
return 0;
}