zoukankan      html  css  js  c++  java
  • [USACO14MAR] Watering the Fields S

    二维平面上有 (n) 个点,每两个点间如果连边,那么权值定义为它们距离的平方。只允许连接权值 (geq C) 的边,求最小生成树。(n leq 2000)

    Solution

    难度:L1

    暴力连边然后跑 MST (应该能卡过去吧)

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 2000005;
    
    int n,fa[2005],ans,c,ind,x[2005],y[2005];
    
    struct edge {
        int u,v,w;
        bool operator < (const edge &b) const {
            return w < b.w;
        }
    } e[N];
    
    int find(int p) {
        return fa[p]==p?p:fa[p]=find(fa[p]);
    }
    
    void merge(int p,int q) {
        p=find(p); q=find(q);
        if(p!=q) fa[p]=q;
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>c;
        for(int i=1;i<=n;i++) {
            cin>>x[i]>>y[i];
        }
        for(int i=1;i<=n;i++) {
            for(int j=1;j<i;j++) {
                int tmp = (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
                if(tmp>=c) e[++ind]={i,j,tmp};
            }
        }
        for(int i=1;i<=n;i++) fa[i]=i;
        sort(e+1,e+ind+1);
        for(int i=1;i<=ind;i++) {
            edge ed = e[i];
            if(find(ed.u)!=find(ed.v)) {
                merge(ed.u,ed.v);
                ans+=ed.w;
            }
        }
        for(int i=2;i<=n;i++) if(find(i)!=find(1)) {
            cout<<-1;
            return 0;
        }
        cout<<ans;
    }
    
    
  • 相关阅读:
    go正则解析log文件
    go的堆排序
    golang实现websocket
    golang接口
    erlang时间操作
    golang函数
    golang for循环
    golang 条件语句if,switch
    golang内建变量类型
    区间存在幂个数
  • 原文地址:https://www.cnblogs.com/mollnn/p/12493295.html
Copyright © 2011-2022 走看看