USACO22FEB Moo Network G

洛谷P8191 USACO22FEB Moo Network G

题目大意

有 n n n个点,第 i i i个点的位置为 ( x i , y i ) (x_i,y_i) (xi,yi),其中 0 ≤ x i ≤ 1 0 6 , 0 ≤ y i ≤ 10 0\leq x_i\leq 10^6,0\leq y_i\leq 10 0≤xi≤106,0≤yi≤10。连接两个点 i , j i,j i,j的成本是 ( x i − x j ) 2 + ( y i − y j ) 2 (x_i-x_j)^2+(y_i-y_j)^2 (xi−xj)2+(yi−yj)2,求能使这 n n n个点连通的最小成本。

1 ≤ n ≤ 1 0 5 1\leq n\leq 10^5 1≤n≤105

题解

观察数据范围发现, y y y的范围不超过 10 10 10,而连最短的边显然更优,所以对于每个点,我们可以将其与距离其较近的点连边,然后在这些边中做 kruskal \text{kruskal} kruskal即可。

先将点按横坐标从小到大排序,横坐标相同的按纵坐标排序,然后对于每个点,向左找 30 30 30个点连边,再在这些边中做 kruskal \text{kruskal} kruskal。因为 y y y的范围不超过 10 10 10,所以最小生成树中的边一般都在上面建的这些边中。

时间复杂度为 O ( 30 n log ⁡ n ) O(30n\log n) O(30nlogn)。

code

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,v1=0,fa[100005];
long long ans=0;
struct node{
	int x,y;
}w[100005];
struct line{
	int x,y;
	long long dis;
}v[3000005];
bool cmp1(node ax,node bx){
	if(ax.x!=bx.x) return ax.x<bx.x;
	return ax.y<bx.y;
}
bool cmp2(line ax,line bx){
	return ax.dis<bx.dis;
}
long long dis(int i,int j){
	return 1ll*(w[i].x-w[j].x)*(w[i].x-w[j].x)+1ll*(w[i].y-w[j].y)*(w[i].y-w[j].y);
}
int find(int ff){
	if(fa[ff]!=ff) fa[ff]=find(fa[ff]);
	return fa[ff];
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&w[i].x,&w[i].y);
		fa[i]=i;
	}
	sort(w+1,w+n+1,cmp1);
	for(int i=1;i<=n;i++){
		for(int j=max(i-30,1);j<i;j++){
			v[++v1]=(line){i,j,dis(i,j)};
		}
	}
	sort(v+1,v+v1+1,cmp2);
	for(int i=1;i<=v1;i++){
		int r1=find(v[i].x),r2=find(v[i].y);
		if(r1!=r2){
			fa[r1]=r2;
			ans+=v[i].dis;
		}
	}
	printf("%lld",ans);
	return 0;
}
相关推荐
一只旭宝15 分钟前
【C++复习】四种类型转换 + 常见设计模式 + Redis/MySQL(后端面试复习完整版)
c++·redis·笔记·mysql·设计模式
rhett. li20 分钟前
用 AI 写 C++ 桌面 UI:TRAE + nim_duilib 实战指南
c++·人工智能·ui
ShineWinsu32 分钟前
对于Redis:Redis特性以及应用场景的解析
linux·c++·redis·缓存·高并发·分布式系统·key-value
-森屿安年-36 分钟前
买卖股票的最佳时机
c++·贪心算法
2601_962218611 小时前
C++ AVL树概念与实现详解
开发语言·c++
炘爚1 小时前
C++(STL)
开发语言·c++
2601_962218611 小时前
C++ string 类原理、踩坑与对象语义详解
开发语言·c++
爱写代码的小朋友1 小时前
Windows 下 MSYS2 + MinGW64 安装与使用 OpenCV 全指南(含踩坑记录)
c++·人工智能·windows·opencv
重生之小比特2 小时前
【C++进阶】封装红⿊树实现mymap和myset
开发语言·c++
YYYing.2 小时前
【设计模式系列 (四) 】建造者模式
c++·后端·设计模式·建造者模式·c/c++