模板题 刚学的最小生成树 有点小兴奋

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>

using std::sort;
struct dat
{
    int nx;
    int ny;
    double nl;
    bool operator<(const dat p) const
    {
        return nl<p.nl;
    }
}a[250010];
int n,s,b;
double point[510][2];
int p[510];
int find(int x){return p[x]==x?x : p[x]=find(p[x]);}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
      scanf("%d %d",&s,&n);
      for(int i=1; i<=n; i++)
        scanf("%lf %lf",&point[i][0],&point[i][1]);
        int ans=0;
      for(int i=1; i<=n; i++)
      {
          for(int j=i+1; j<=n; j++)
          {
              a[ans].nx=i;
              a[ans].ny=j;
              double x=point[i][0]-point[j][0];
              double y=point[i][1]-point[j][1];
              a[ans++].nl=sqrt(x*x+y*y);
          }
      }
      sort(a,a+ans);
      int mm=n-s;
      int ou=0;
      for(int i=1; i<=n; i++)
        p[i]=i;
        double sum=0;
      for(int i=0; i<ans; i++)
      {
          int x=find(a[i].nx);
          int y=find(a[i].ny);
          if(x!=y)
          {
              //printf("%d %d\n",a[i].nx,a[i].ny);
              ou++;
              p[x]=y;
              if(ou<=mm)
                sum=a[i].nl;
          }
      }
      printf("%.2lf\n",sum);
    }
    return 0;
}
View Code

 

   

posted on 2013-08-03 20:42  风流monkey  阅读(115)  评论(0)    收藏  举报