这次真的是个不能再板子一点的板子题。
http://codevs.cn/problem/2627/
真不知道我到底有多菜。
一定不要再忘记初始化并查集了。
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 10000 + 7;
int fa[MAXN];
int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
bool same(int x,int y) {return find(x) == find(y);}
void unite(int x,int y) {fa[find(x)] = find(y);}
int strr = 0;
int coststrr;
struct Edge
{
int u,v,cost;
} es[MAXN];
bool cmp(Edge e1,Edge e2)
{
return e1.cost < e2.cost;
}
int cost_sum = 0;
int n;
void kruskal()
{
for(int i=1;i<=n;i++) fa[i]=i;
sort(es + 1,es + strr + 1,cmp);
for(int i = 1;i <= strr;i ++)
{
Edge e = es[i];
if(!same(e.u,e.v))
{
unite(e.u,e.v);
cost_sum += e.cost;
}
}
}
int main()
{
cin>>n;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
{
cin>>coststrr;
es[++ strr].u = i;
es[strr].v = j;
es[strr].cost = coststrr;
}
kruskal();
cout<<cost_sum;
}