zoukankan      html  css  js  c++  java
  • bzoj 2429: [HAOI2006]聪明的猴子 (最小生成树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2429

    思路:就是找最小生成树最大的一条边,最小生成树的性质,最后加入的那条边就是最大的

    实现代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int M = 1e6 + 10;
    struct node{
        int u,v,w;
    }e[M];
    
    struct node1{
        int x,y;
    }v[M];
    int f[M],a[M];
    bool cmp(node a,node b){
        return a.w < b.w;
    }
    
    int Find(int x){
        if(x == f[x]) return x;
        return f[x] = Find(f[x]);
    }
    
    int main()
    {
        int n,m,cnt = 0;
        cin>>n;
        for(int i = 1;i <= n;i ++){
            cin>>a[i];
        }
        cin>>m;
        for(int i = 1;i <= m;i ++){
            cin>>v[i].x>>v[i].y;
            f[i] = i;
        }
        for(int i = 1;i <= m;i ++){
            for(int j = i+1;j <= m;j ++){
                e[++cnt].u = i; e[cnt].v = j;
                e[cnt].w = (v[i].x-v[j].x)*(v[i].x-v[j].x)+(v[i].y-v[j].y)*(v[i].y-v[j].y);
            }
        }
        sort(e+1,e+1+cnt,cmp);
        int mx = 0,tot= 0;
        for(int i = 1;i <= cnt;i ++){
            int fx = Find(e[i].u),fy = Find(e[i].v);
            if(fx != fy){
                f[fy] = fx;
                tot++;
                if(tot == m-1){
                    mx = e[i].w;
                    break;
                }
            }
        }
        //cout<<mx<<endl;
        int ans = 0;
        for(int i = 1;i <= n;i ++){
            if(a[i]*a[i] >= mx)
                ans++;
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    由 基本数据型态转换成 String/ 由 String 转换成 数字的基本数据型态
    屏幕适配(UGUI)非UI
    转载 Unity Text 插入超链接
    File类的使用
    抽奖
    竖倾斜ScrollView
    本地资源_Asset
    小型自动朝向转盘
    简易C# socket
    Lua class
  • 原文地址:https://www.cnblogs.com/kls123/p/10606736.html
Copyright © 2011-2022 走看看