这题很裸,没啥意思,就是今晚被保安吓到了,想来找找水题切切,刚好后面习题还没写。。。刚好写个kruskal压压惊吧。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define M 10900 //100*99/2
typedef long long ll;
typedef struct
{
int from;
int to;
int weight;
}edge;
edge e[M];
int n,k;
int p[M];
bool cmp(edge a ,edge b)
{
return a.weight < b.weight;
}
int find(int x)
{
return x==p[x]?x:p[x] = find(p[x]);
}
ll kruskal()
{
for(int i = 0;i < n;i++) p[i] = i;
ll ans = 0;
for(int i = 0;i < k;i++)
{
int x = find(e[i].from);
int y = find(e[i].to);
if(x != y)
{
p[x] = y;
ans += (ll)e[i].weight;
}
}
return ans;
}
int main()
{
while(scanf("%d",&n)==1)
{
k = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
int temp;
scanf("%d",&temp);
if(j > i)
{
e[k].from = i;
e[k].to = j;
e[k++].weight = temp;
}
}
}
sort(e,e+k,cmp);
printf("%lld\n",kruskal());
}
return 0;
}