zoukankan      html  css  js  c++  java
  • [洛谷1991]无线通讯网

    思路:
    考虑使用卫星替代最小生成树中最大的$s-1$条边,答案即为剩下的最大边。

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cctype>
     4 #include<vector>
     5 #include<algorithm>
     6 inline int getint() {
     7     char ch;
     8     while(!isdigit(ch=getchar()));
     9     int x=ch^'0';
    10     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    11     return x;
    12 }
    13 inline int sqr(const int x) {
    14     return x*x;
    15 }
    16 const int N=500;
    17 struct Point {
    18     int x,y;
    19     friend double dist (const Point a,const Point b) {
    20         return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
    21     }
    22 };
    23 Point p[N];
    24 struct Edge {
    25     int u,v;
    26     double w;
    27     bool operator < (const Edge &another) const {
    28         return w<another.w;
    29     }
    30 };
    31 std::vector<Edge> e;
    32 class DisjointSet {
    33     private:
    34         int anc[N];
    35         int Find(const int x) {
    36             return x==anc[x]?x:anc[x]=Find(anc[x]);
    37         }
    38     public:
    39         DisjointSet() {
    40             for(int i=0;i<N;i++) anc[i]=i;
    41         }
    42         bool isConnected(const int x,const int y) {
    43             return Find(x)==Find(y);
    44         }
    45         void Union(const int x,const int y) {
    46             anc[Find(x)]=Find(y);
    47         }
    48 };
    49 DisjointSet s;
    50 int main() {
    51     int m=getint(),n=getint();
    52     for(int i=0;i<n;i++) {
    53         p[i].x=getint();
    54         p[i].y=getint();
    55     }
    56     for(int i=0;i<n;i++) {
    57         for(int j=i+1;j<n;j++) {
    58             e.push_back((Edge){i,j,dist(p[i],p[j])});
    59         }
    60     }
    61     std::sort(e.begin(),e.end());
    62     double ans;
    63     for(unsigned i=0,cnt=n-m;i<e.size()&&cnt;i++) {
    64         int u=e[i].u,v=e[i].v;
    65         double w=e[i].w;
    66         if(s.isConnected(u,v)) continue;
    67         s.Union(u,v);
    68         ans=w;
    69         cnt--;
    70     }
    71     printf("%.2f",ans);
    72     return 0;
    73 }
  • 相关阅读:
    《mysql必知必会》学习_第23章_20180809
    禁止电脑自动乱装流氓软件
    网络地址转换技术NAT
    闲置手机作电脑无线音箱
    TransMac工具制作MacOS启动U盘
    制作MacOS启动U盘
    解决centos7启动后出现Warning: dracut-initqueue timeout‘ at startup进入emergency mode的问题
    思科 锐捷命令行简介
    VRRP 虚拟网关冗余协议
    STP 生成树协议
  • 原文地址:https://www.cnblogs.com/skylee03/p/7399050.html
Copyright © 2011-2022 走看看