zoj网站上不去了
写了代码也还没来得及测试
隐约觉得应该会有问题
不过目前测试的数据还是对的。。。
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
const int N = 100;
int n,v[N+2],x;
double s,r[N+2][2];
struct dis
{
double n1;
double n2;
double d;
}m[N*N];
bool cmp(dis a,dis b)
{
return a.d<b.d;
}
int Dis()
{
int i = 0, j = 0, k = 0;
for (i = 1; i < n; i++)
{
for (j = i + 1; j <= n; j++)
{
m[k].n1 = i;
m[k].n2 = j;
m[k].d = sqrt((r[i][0] - r[j][0])*(r[i][0] - r[j][0]) + (r[i][1] - r[j][1])*(r[i][1] - r[j][1]));
k++;
}
}
return k;
}
void input()
{
int i = 0;
for (i = 0; i < n; i++)
{
scanf_s("%lf %lf", &r[i][0], &r[i][1]);
//cin >> r[i][0] >> r[i][1];
}
}
void mintree(int x1,int x2,int i)
{
x1 = v[x1];
x2 = v[x2];
if (x1 == x2)
{
if (!x1)
{
v[x1]--;
v[x2] = x1;
s = s + m[i].d;
x++;
}
}
else
{
if (x1*x2)
{
v[x1] = v[x1] + v[x2];
v[x2] = x1;
s = s + m[i].d; x++;
}
else
{
if (x1)
{
v[x1]--;
v[x2] = x1;
s = s + m[i].d; x++;
}
else
{
v[x2]--;
v[x1] = x2;
s = s + m[i].d; x++;
}
}
}
}
int find(int mm)
{
if (v[mm] > 0)
{
while (v[mm] > 0)
{
mm = v[mm];
}
}
return mm;
}
int main()
{
int i=0,x1=0,x2=0,k=0,t=1;
while (scanf_s("%d",&n)&&n)//cin>>n
{
input();
k=Dis();
sort(m,m+k,cmp);
while (x != n - 1)
{
x1 = find(m[i].n1);
x2 = find(m[i].n2);
mintree(x1,x2,i);
i++;
}
printf( "Case #%d:\n",t);
printf("The minimal distance is:%.2lf", s);
x = 0; i = 0; s = 0; t++;
}
system("pause");
return 0;
}