Link:
A:
贪心从小到大插入,用并查集维护连通性
#include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN=1e3+10; int n,tot,cnt,f[MAXN];P dat[MAXN]; struct edge{int x,y;ll w;}e[MAXN*MAXN]; ll sqr(int x){return 1ll*x*x;} bool cmp(edge x,edge y){return x.w<y.w;} int find(int x){return f[x]==x?x:f[x]=find(f[x]);} int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&dat[i].X,&dat[i].Y),f[i]=i; for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) e[++tot]={i,j,sqr(dat[i].X-dat[j].X)+sqr(dat[i].Y-dat[j].Y)}; sort(e+1,e+tot+1,cmp); cnt=n; for(int i=1;i<=tot;i++) { int px=find(e[i].x),py=find(e[i].y); if(px!=py) f[px]=py,cnt--; if(cnt==1) return printf("%lld",e[i].w),0; } return 0; }