• 题解:无线通讯网


    qwq

    跑最小生成树

    一共n个电话,所以相当于最小生成树里删去最大的n-1的边

    所以答案即为最小生成树的第n大边

    prim或者kruskal都行

    这是prim

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cmath>
     5 using namespace std;
     6 int x[505], y[505];
     7 int p, n, now, cnt;
     8 double ans[505], dis[505][505], d[505];
     9 bool used[505];
    10 bool cmp(double a,double b){
    11      return a>b;
    12 }
    13 int main(){
    14     scanf("%d%d",&p,&n);
    15     for(int i=1; i<=n; i++){
    16         scanf("%d%d",&x[i],&y[i]);
    17         d[i]=0x3f3f3f3f;
    18     }
    19     for(int i=1; i<=n; i++){
    20         for(int j=1; j<i; j++){
    21             double a=x[i]-x[j];
    22             double b=y[i]-y[j];
    23             a*=a;
    24             b*=b;
    25             dis[i][j]=sqrt(a+b);
    26             dis[j][i]=dis[i][j];
    27         }
    28     }
    29     d[1]=0;
    30     for(int i=1; i<=n; i++){
    31         double minn=0x3f3f3f3f3f;
    32         for(int j=1; j<=n; j++){
    33             if(minn>d[j] && !used[j]){
    34                 minn=d[j];
    35                 now=j;
    36             }
    37         }
    38         used[now]=true;
    39         ans[++cnt]=minn;
    40         for(int j=1; j<=n; j++){
    41             if(!used[j]){
    42                 d[j]=min(d[j], dis[now][j]);
    43             }
    44         }
    45     }
    46     sort(ans+1, ans+n+1, cmp);//按照从大到小排序
    47     printf("%.2lf", ans[p]);
    48     return 0;
    49 }

    这是kruskal,来自于pushinl

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<cstring>
     6 #define N 501
     7 using namespace std;
     8 int f[N], px[N], py[N];
     9 double ans[N];
    10 int n, k, num, cnt;
    11 struct data{
    12     int x, y;
    13     double d;
    14 }b[N*N];
    15 double dis(int ax, int ay, int bx, int by){
    16     return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
    17 }
    18 int find(int x){
    19     if(f[x]!=x)f[x]=find(f[x]);
    20     return f[x];
    21 }
    22 inline bool cmp(const data&a, const data&b){
    23     return a.d<b.d;
    24 }
    25 int main(){
    26     scanf("%d%d", &k, &n);
    27     for(int i=1; i<=n; i++)
    28         scanf("%d%d", &px[i], &py[i]);
    29     for(int i=1; i<=n; i++)
    30         for(int j=i+1; j<=n; j++)
    31             b[++num]=(data){i, j, dis(px[i], py[i], px[j], py[j])};
    32     sort(b+1, b+num+1, cmp);
    33     for(int i=1; i<=n; i++)
    34         f[i]=i;
    35     for(int i=1; i<=num; i++){
    36         int x=find(b[i].x);
    37         int y=find(b[i].y);
    38         if(x!=y){
    39             f[y]=x;
    40             ans[++cnt]=b[i].d;
    41         }
    42         if(cnt==n-1)break;//枚举到n-1或者n-k也行
    43     }
    44     printf("%.2f", ans[n-k]);注意是n-k,因为这里并没有重新排序,
    45     return 0;
    46 }

    话说luogu数据真的是十分水了orzzz

  • 相关阅读:
    Console.WriteLine输出字符格式化
    GridView动态生成列问题
    日历控件,可运行在XHTML1.0下
    GridView內容導出Excel時異常:必须置於有 runat=server 的表单标记之中
    圆弧分割
    矩阵变换
    使用group by 来统计的小作业
    group by 后使用 rollup 子句总结
    mysql字符串拼接,存储过程,(来自网上看到)
    【深入理解Linux内核】《第二章 内存寻址》笔记 (2014-06-28 12:38)
  • 原文地址:https://www.cnblogs.com/Aze-qwq/p/9886047.html
Copyright © 2020-2023  润新知