#include<stdio.h>
#include<algorithm>
using namespace std;
int tree[100];
int findroot(int x)
{
if (tree[x] == -1)
return x;
else
{
int temp = findroot(tree[x]);
tree[x] = temp;
return temp;
}
}
struct edge
{
int a, b;
int cost;
}edg[5000];
bool func(edge a, edge b)
{
return a.cost < b.cost;
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int i ;
for (i = 0; i < n*(n - 1) / 2; i++)
scanf("%d%d%d", &edg[i].a, &edg[i].b, &edg[i].cost);
sort(edg, edg + n * (n - 1) / 2, func);
for (i = 0; i < n; i++)
tree[i] = -1;
int ans = 0;
for (i = 0; i < n*(n - 1) / 2; i++)
{
int a = findroot(edg[i].a);
int b = findroot(edg[i].b);
if (a != b)
{
tree[a] = b;
ans += edg[i].cost;
}
}
printf("%d\n", ans);
}
return 0;
}
机试题Freckles
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int tree[100];
int findroot(int x)
{
if (tree[x] == -1)
return x;
else
{
int temp = findroot(tree[x]);
tree[x] = temp;
return temp;
}
}
struct edge
{
int a, b;
double cost;
bool operator < (const edge &a) const
{
return cost < a.cost;
}
}edg[5000];
struct point
{
double x, y;
double distance(point a)
{
double temp = (x - a.x)*(x - a.x) + (y - a.y)*(y - a.y);
return sqrt(temp);
}
}list[100];
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
for (int i = 0; i < n; i++)
{
scanf("%lf%lf", &list[i].x, &list[i].y);
tree[i] = -1;
}
int size = 0;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
edg[size].a = i;
edg[size].b = j;
edg[size].cost = list[i].distance(list[j]);
size++;
}
}
sort(edg, edg + size);
double ans = 0;
for (int i = 0; i < size; i++)
{
int a = findroot(edg[i].a);
int b = findroot(edg[i].b);
if (a != b)
{
tree[a] = b;
ans += edg[i].cost;
}
}
printf("%.2lf\n", ans);
}
return 0;
}