数组开小了 还RE了一遍....... 最小生成树 按费用从小到大排。。。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int n, m, s, p[300000];
struct node
{
int u,v;
double len;
bool operator < (const node &p) const
{
return len < p.len;
}
};
node cc[300000];
int find(int x)
{
return p[x] == x ? x : (p[x] =find(p[x]));
}
double kk()
{
int q = 0;
for(int i = 0; i < s; i++)
p[i] = i;
sort(cc, cc+m);
for(int i = 0; i < m; i++)
{
int x = find(cc[i].u);
int y = find(cc[i].v);
if(x != y)
{
p[x] = y;
q++;
if(q == s - n)
return cc[i].len;
}
}
return 0;
}
int main()
{
int t;
double x[510], y[510];
scanf("%d", &t);
while(t--)
{
m = 0;
scanf("%d%d", &n, &s);
for(int i = 0; i < s; i++)
scanf("%lf%lf", &x[i], &y[i]);
for(int i = 0; i < s; i++)
for(int j = i+1; j < s; j++)
{
cc[m].u = i, cc[m].v = j;
double d1 = x[i] - x[j], d2 = y[i] - y[j];
cc[m++].len = sqrt(d1*d1 + d2*d2);
}
printf("%.2lf\n",kk());
}
return 0;
}