题意:在n个农场之间修路使各个农场之间可以相互到达。
思路:kruskal求最小生成树
#include
#include
#include
using namespace std;
int n, cnt, fa[110];
int find(int x)
{
int temp = x;
while(fa[x] != x)
{
x = fa[x];
}
fa[temp] = x;
return x;
}
struct Edge
{
int len, u, v;
}edge[10010];
int cmp(const void *a, const void *b)
{
return (*(Edge *)a).len - (*(Edge *)b).len;
}
int Kruskal()
{
int num = 0, ans = 0;
for(int i = 0; i < n; i++)
fa[i] = i;
qsort(edge, cnt, sizeof(edge[0]), cmp);
for(int i = 0; i < cnt; i++)
{
int x = find(edge[i].u), y = find(edge[i].v);
if(x != y) //若x == y,连线后有环
{
ans += edge[i].len; num++; fa[x] = y;
if(num == n - 1) break;
}
}
return ans;
}
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif
int cur;
while(scanf("%d", &n) != EOF)
{
cnt = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
scanf("%d", &cur);
if(i < j && cur)
{
edge[cnt].len = cur;
edge[cnt].u = i; edge[cnt].v = j;
cnt++;
}
}
printf("%d\n", Kruskal());
}
return 0;
}