【Luogu P1661】扩散
题目:
一个点每过一个单位时间就会向四个方向扩散一个距离,如图。

两个点$a$、$b$连通,记作$e(a,b)$,当且仅当$a$、$b$的扩散区域有公共部分。连通块的定义是块内的任意两个点$u$、$v$都必定存在路径$e(u,a_0),e(a_0,a_1),\cdots,e(a_k,v)$。给定平面上的$n$个点,问最早什么时刻它们形成一个连通块。
分析:
一看$n\lt 50$?随便搞即可。
考虑若$n\lt 10^3$怎么做。
考虑每个点$(x_1,y_1)$和$(x_2,y_2)$形成联通块所需要的时间为
$$\frac{|x_1-x_2|+|y_1-y_2|}{2}$$
故我们需要求一个生成树,其中对于每个点$(u,v)$,$\frac{|x_u-x_v|+|y_u-y_v|}{2}$最小。
$\rm Kruskal$算法即可,时间复杂度$O(n^2\log n^2)$。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = ;
int fa[MAXN], x[MAXN], y[MAXN], n, tot = , maxn = ;
int find(int x) {
return fa[x] == x ? fa[x] : (fa[x] = find(fa[x]));
}
void merge(int x, int y) {
fa[find(y)] = find(x);
}
struct edge {
int from, to;
edge() {
}
edge(int jbk, int stt) {
from = jbk; to = stt;
}
} edges[MAXN * MAXN];
int ha(edge a) {
return abs(x[a.from] - x[a.to]) + abs(y[a.from] - y[a.to]);
}
bool cmp(edge a, edge b) {
return ha(a) < ha(b);
}
int main() {
ios::sync_with_stdio(false);
cin >> n;
for(int i = ; i < n; i++)
fa[i] = i;
for(int i = ; i < n; i++) {
cin >> x[i] >> y[i];
}
for(int i = ; i < n; i++)
for(int j = ; j < i; j++) {
edge v(i, j);
edges[tot++] = v;
}
sort(edges, edges + tot, cmp);
for(int i = ; i < tot; i++)
if(find(edges[i].from) != find(edges[i].to)) {
maxn = max(ha(edges[i]), maxn);
merge(edges[i].from, edges[i].to);
}
cout << (int)(ceil(maxn / 2.0)) << endl;
return ;
}
【Luogu P1661】扩散的更多相关文章
- P1661 扩散
P1661 扩散 二分+最小生成树(kruskal使用并查集) 不清楚的题意导致我被坑了qwq,其实间接联通也是允许的.所以可以使用并查集+最小生成树维护 每次二分答案,然后跑一遍最小生成树判断是否联 ...
- 洛谷P1661 扩散
题目描述 一个点每过一个单位时间就会向四个方向扩散一个距离,如图. 两个点a.b连通,记作e(a,b),当且仅当a.b的扩散区域有公共部分.连通块的定义是块内的任意两个点u.v都必定存在路径e(u,a ...
- [Luogu] 消息扩散
https://www.luogu.org/problemnew/show/2002 Tarjan 缩点 + 入度判断 #include <iostream> #include <c ...
- 【luogu P2002】消息扩散
https://www.luogu.org/problem/show?pid=2002 SCC缩点的模板题,缩点后统计入度为0的点的数量就完了. #include <iostream> # ...
- Luogu P2002 消息扩散&&P1262 间谍网络
怕自己太久没写Tarjan了就会把这种神仙算法忘掉. 其实这种类型的图论题的套路还是比较简单且显然的. P2002 消息扩散 很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个 ...
- 【luogu P2002 消息扩散】 题解
题目链接:https://www.luogu.org/problemnew/show/P2002 缩点把原图变为DAG,再在DAG上判断找入度为0的点的个数. 注意一点出度为0的点的个数不等于入度为0 ...
- 【Luogu P2002&P2341】消息扩散/受欢迎的奶牛
Luogu P2002 Luogu P2341 使用强连通分量算法缩点 第一题统计入度为0的个数强连通分量数. 第二题的答案为当且仅当仅有一个强连通分量的出度为0时该强连通分量的节点数,原因如下:若一 ...
- LuoGu P2002 消息扩散
题目传送门 这个题其实就是tarjan缩点的板子题对吧....至少我是这么想的 首先这是个有向图,对于一个有向图,我们肯定要考虑环的存在与否,恰好这个题又是让我们找出最少的点,使得这几个点能够走遍全图 ...
- 洛谷P1661 & yzoj 1650 扩散 题解
题意 先讲一下一种容易陷入误区错误思路 要使时间最小,就去找相对于每个点的最短曼哈顿距离,然后取最大值,时间就是(maxn+1)/2. 代码 #include<cstring> #incl ...
随机推荐
- hihoCoder #1143 : 骨牌覆盖问题·一 (斐波那契数列)
题意:我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘.对于这个棋盘,一共有多少种不同的覆盖方法呢? 思路:这是斐波那契数列啊,f[n] = f[n-1] + f[n-2],初始时 f[ ...
- Ubuntu 16.04 开启休眠功能
因为休眠功能在部分计算机无法正常工作,所以Ubuntu默认是不开启休眠功能. 要想开启休眠功能先进行如下测试: 1.先检查是否有交换分区(swap),如果有确认交换分区至少和实际可用内存一样大. 2. ...
- pta 编程题6 树的同构
其它pta数据结构编程题请参见:pta 题目请参见:树的同构 因题目中左右子树是按照下标给出,因此用数组存放树是更好的方法. 判断两棵树是否同构:用递归的方法.如果当前两个结点都为空,则返回TRUE: ...
- 【转载】#229 - The Core Principles of Object-Oriented Programming
As an object-oriented language, c# supports the three core principles of object-oriented programming ...
- 2019年5~6月训练记录(更新ing)
前言 \(ZJOI\)正式结束了. 但期中考试只考了年级\(216\),退役既视感... 于是就被抓回去补文化课了. 下半个学期可能要以文化课为主了吧! 但周三.周日应该还是会正常参加训练的,但其他时 ...
- make 出错: /usr/bin/ld: cannot find -lrt
make 出错:/usr/bin/ld: cannot find -lrtcollect2: ld returned 1 exit statusmake: *** [page_parser] Erro ...
- python_47_Python2中字符编码与转码
#python3默认是Unicode,Unicode是万国码,不管中文字符还是英文,所有的每个字符都占2个字节空间,16位 #python2默认是ascii码 #ascii码不能存中文,一个英文只能占 ...
- 漫谈 Clustering (番外篇): Dimensionality Reduction
由于总是有各种各样的杂事,这个系列的文章竟然一下子拖了好几个月,(实际上其他的日志我也写得比较少),现在决定还是先把这篇降维的日志写完.我甚至都以及忘记了在这个系列中之前有没有讲过“特征”(featu ...
- 更换PostgreSql的data文件夹并重新服务器(此方法同样适用于系统崩溃后,找回数据的操作)
*如果是系统崩溃,需要找回数据,PostgreSQL安装目录的data文件夹要存在 1.备份PostgreSQL安装目录到其他目录下 2.停止Postgres服务,可以在运行中输入services.m ...
- 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...