1 条题解
-
0
// 最小生成树 Kruskal算法 O(MlogM) #include<bits/stdc++.h> using namespace std; const int N=2010,M=4000010; int n,c,m,tot,ans,x[N],y[N],fa[N]; pair<int,pair<int,int> >e[M]; //边集 int find(int u){ //并查集的找根 return fa[u]==u?u:fa[u]=find(fa[u]); } void kruskal(){ sort(e+1,e+m+1); //排序 for(int i=1; i<=n; i++) fa[i]=i; for(int i=1; i<=m; i++){ int x=find(e[i].second.first),y=find(e[i].second.second); if(x!=y){ fa[x]=y; ans+=e[i].first; if(++tot==n) break; } } if(tot==n-1) printf("%d\n",ans); else puts("-1"); } int main(){ cin>>n>>c; for(int i=1;i<=n;i++){ scanf("%d %d",&x[i],&y[i]); for(int j=1;j<i;j++){ int d=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); if(d>=c) e[++m]={d,{i,j}}; } } kruskal(); }
- 1
信息
- ID
- 6744
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者