• uva 10397【Connect the Campus】


    Krustral  变形。。。。。。

    代码如下:
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <cmath>
     5 
     6 struct distance
     7 {
     8     int u,v;
     9     double w;
    10 }d[1000000];
    11 
    12 struct point
    13 {
    14     int x,y;
    15 }p[1000];
    16 
    17 int f[1000];
    18 int n;
    19 int num;
    20 
    21 bool cmp(const distance& a,const distance& b)
    22 {
    23     if(a.w == b.w)
    24         return a.u < b.u;
    25     return a.w < b.w;
    26 }
    27 
    28 double dis(point a,point b)
    29 {
    30     return sqrt(1.0*(a.x - b.x) * (a.x - b.x) + 1.0 * (a.y - b.y) * (a.y - b.y));
    31 }
    32 
    33 int find(int x)
    34 {
    35     if(x == f[x])
    36         return x;
    37     f[x] = find(f[x]);
    38     return f[x];
    39 }
    40 
    41 void Krustral()
    42 {
    43     double sum = 0;
    44     int k = 0;
    45     for(int i = 0;i < num;i ++)
    46     {
    47         int fa = find(d[i].u);
    48         int fb = find(d[i].v);
    49         if(fa != fb)
    50         {
    51             f[fa] = fb;
    52             sum += d[i].w;
    53             k ++;
    54         }
    55         if(k == n -1)
    56             break;
    57     }
    58 
    59     printf("%.2lf\n",sum);
    60 }
    61 
    62 int main()
    63 {
    64     while(scanf("%d",&n) == 1)
    65     {
    66         num = 0;
    67         for(int i = 1;i <= n;i ++)
    68         {
    69             scanf("%d%d",&p[i].x,&p[i].y);
    70             for(int j = 1;j < i;j ++)
    71             {
    72                 d[num].u = i;
    73                 d[num].v = j;
    74 
    75                 d[num ++].w = dis(p[i],p[j]);
    76             }
    77         }
    78 
    79         std::sort(d,d + num,cmp);
    80         for(int i = 0;i <= n;i ++)
    81         {
    82             f[i] =i;
    83         }
    84         int on;
    85         scanf("%d",&on);
    86         for(int i = 0;i < on;i ++)
    87         {
    88             int a,b;
    89             scanf("%d%d",&a,&b);
    90             f[find(a)] = find(b);
    91         }
    92 
    93         Krustral();
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    mysql优化思路
    mysql列类型选择
    mysql 多列索引的生效规则
    Myisam索引和Innodb索引的区别
    mysql创建远程用户并授权
    mysql 索引长度和区分度
    php 内存共享shmop源码阅读
    短链接系统的算法原理
    PHP die与exit的区别
    MySQL建立外键(Foreign Key)
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2451575.html
Copyright © 2020-2023  润新知