1 条题解

  • 0
    @ 2026-10-25 22:04:21

    思路

    无线电将村庄划分为至多max(k,1)个连通分量,Kruskal合并到目标分量;k>=n输出0,重复坐标合法,平方距离排序后再开方保留2位。

    参考程序(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    struct DSU{vector<int>p,s;DSU(int n):p(n),s(n,1){iota(p.begin(),p.end(),0);}int find(int x){return p[x]==x?x:p[x]=find(p[x]);}bool join(int a,int b){a=find(a);b=find(b);if(a==b)return false;if(s[a]<s[b])swap(a,b);p[b]=a;s[a]+=s[b];return true;}};
    int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n,k;cin>>n>>k;vector<pair<int,int>>a(n);for(auto &p:a)cin>>p.first>>p.second;int target=max(k,1);if(target>=n){cout<<"0.00\n";return 0;}vector<tuple<long long,int,int>>e;for(int i=0;i<n;i++)for(int j=0;j<i;j++){long long x=a[i].first-a[j].first,y=a[i].second-a[j].second;e.push_back({x*x+y*y,i,j});}sort(e.begin(),e.end());DSU ds(n);int components=n;long long ans=0;for(auto t:e){long long w;int u,v;tie(w,u,v)=t;if(ds.join(u,v)){ans=w;if(--components==target)break;}}cout<<fixed<<setprecision(2)<<sqrt((long double)ans)<<'\n';}
    
    • 1

    信息

    ID
    1546
    时间
    1000ms
    内存
    64MiB
    难度
    普及
    标签
    递交数
    1
    已通过
    1
    上传者