• hdu1162Eddy's picture


    http://acm.hdu.edu.cn/showproblem.php?pid=1162

    最小生成树

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<math.h>
     4 #include<string.h>
     5 #include<stdlib.h>
     6 using namespace std;
     7 const int N=5005;
     8 struct stu{
     9     int u;
    10     int v;
    11     double w;
    12 }p[N];
    13 
    14 struct ln{
    15     double x;
    16     double y;
    17 }q[N];
    18 int father[N];
    19 int n,m,k;
    20 
    21 int cmp(const void *a,const void *b)
    22 {
    23     return (*(struct stu*)a).w > (*(struct stu*)b).w ?1:-1;
    24 }
    25 int find(int x)
    26 {
    27     if(father[x]!=x)
    28     father[x]=find(father[x]);
    29     return father[x];
    30 }
    31 int make(int a,int b)
    32 {
    33     int h=0;
    34     int f1=find(a);
    35     int f2=find(b);
    36     if(f1>f2)
    37     {
    38         father[f1]=f2;
    39         h=1;
    40     }
    41     else if(f1<f2)
    42     {
    43         father[f2]=f1;
    44         h=1;
    45     }
    46     return h;
    47 }
    48 double kruskal()
    49 {
    50     int cnt=0;
    51     double s=0;
    52     for(int i=0;i<k;i++)
    53     {
    54         if(make(p[i].u,p[i].v))
    55         {
    56             s+=p[i].w;
    57             cnt++;
    58         }
    59         if(cnt==n-1)
    60         return s;
    61     }
    62     return s;
    63 }
    64 void zuhe()
    65 {
    66     k=0;
    67     for(int i=0;i<n;i++)
    68     {
    69         for(int j=i+1;j<n;j++)
    70         {
    71             p[k].u=i+1;
    72             p[k].v=j+1;
    73             p[k++].w=sqrt((q[i].x-q[j].x)*(q[i].x-q[j].x)+(q[i].y-q[j].y)*(q[i].y-q[j].y));
    74         }
    75     }
    76 }
    77 
    78 int main()
    79 {
    80     //freopen("in.txt","r",stdin);
    81     while(~scanf("%d",&n))
    82     {
    83         for(int i=1;i<=n;i++)
    84         father[i]=i;
    85         for(int i=0;i<n;i++)
    86         {
    87             scanf("%lf%lf",&q[i].x,&q[i].y);
    88         }
    89         zuhe();
    90         qsort(p,k,sizeof(struct stu),cmp);
    91 //        for(int i=0;i<k;i++)
    92 //        {
    93 //            printf("%d %d %lf
    ",p[i].u,p[i].v,p[i].w);
    94 //        }
    95         printf("%.2lf
    ",kruskal());
    96     }
    97     return 0;
    98 }
  • 相关阅读:
    [WPF VTK]三维图形开发基础(一)
    WP开发(一)
    [WPF VTK]三维图形开发基础(四)

    WIN8 下IE突然无法打开(管理员权限可打开)
    [WPF VTK]三维图形开发基础(三)
    堆排序、快排的坑
    双向链表之插入
    [WPF VTK]三维图形开发基础(二)
    [转载]Android界面设计学习日志(一)
  • 原文地址:https://www.cnblogs.com/xuesen1995/p/4519878.html
Copyright © 2020-2023  润新知