题目:

一个点每过一个单位时间就会向四个方向扩散一个距离,如图。

两个点$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】扩散的更多相关文章

  1. P1661 扩散

    P1661 扩散 二分+最小生成树(kruskal使用并查集) 不清楚的题意导致我被坑了qwq,其实间接联通也是允许的.所以可以使用并查集+最小生成树维护 每次二分答案,然后跑一遍最小生成树判断是否联 ...

  2. 洛谷P1661 扩散

    题目描述 一个点每过一个单位时间就会向四个方向扩散一个距离,如图. 两个点a.b连通,记作e(a,b),当且仅当a.b的扩散区域有公共部分.连通块的定义是块内的任意两个点u.v都必定存在路径e(u,a ...

  3. [Luogu] 消息扩散

    https://www.luogu.org/problemnew/show/2002 Tarjan 缩点 + 入度判断 #include <iostream> #include <c ...

  4. 【luogu P2002】消息扩散

    https://www.luogu.org/problem/show?pid=2002 SCC缩点的模板题,缩点后统计入度为0的点的数量就完了. #include <iostream> # ...

  5. Luogu P2002 消息扩散&&P1262 间谍网络

    怕自己太久没写Tarjan了就会把这种神仙算法忘掉. 其实这种类型的图论题的套路还是比较简单且显然的. P2002 消息扩散 很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个 ...

  6. 【luogu P2002 消息扩散】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2002 缩点把原图变为DAG,再在DAG上判断找入度为0的点的个数. 注意一点出度为0的点的个数不等于入度为0 ...

  7. 【Luogu P2002&P2341】消息扩散/受欢迎的奶牛

    Luogu P2002 Luogu P2341 使用强连通分量算法缩点 第一题统计入度为0的个数强连通分量数. 第二题的答案为当且仅当仅有一个强连通分量的出度为0时该强连通分量的节点数,原因如下:若一 ...

  8. LuoGu P2002 消息扩散

    题目传送门 这个题其实就是tarjan缩点的板子题对吧....至少我是这么想的 首先这是个有向图,对于一个有向图,我们肯定要考虑环的存在与否,恰好这个题又是让我们找出最少的点,使得这几个点能够走遍全图 ...

  9. 洛谷P1661 & yzoj 1650 扩散 题解

    题意 先讲一下一种容易陷入误区错误思路 要使时间最小,就去找相对于每个点的最短曼哈顿距离,然后取最大值,时间就是(maxn+1)/2. 代码 #include<cstring> #incl ...

随机推荐

  1. genlist -s 192.168.21.\*

    显示网段192.168.21中可用的主机.

  2. nc扫描端口

    nc -n -v -z -w 1 ip地址 1-1000 (端口号) 详细信息 -v 排除dns  -n 不发送任何数据-z 超时设置为1秒 -w 1

  3. 《Ruby on Rails教程》学习笔记

    本文是我在阅读 Ruby on Rails 教程的简体中文版时所做的摘录,以及学习时寻找的补充知识.补充知识主要来自于 Ruby on Rails 實戰聖經. Asset Pipeline 在最新版 ...

  4. UVA Live Archive 4394 String painter(区间dp)

    区间dp,两个str一起考虑很难转移. 看了别人题解以后才知道是做两次dp. dp1.str1最坏情况下和str2完全不相同,相当于从空白串开始刷. 对于一个区间,有两种刷法,一起刷,或者分开来刷. ...

  5. linux slab学习

    https://blog.csdn.net/bullbat/article/details/7194794 https://blog.csdn.net/qq_26626709/article/deta ...

  6. 使用FreeMarker导出word文档(支持导出图片)

    一.添加maven依赖,导入FreeMarker所需要的jar包 <dependency> <groupId>org.freemarker</groupId> &l ...

  7. 关于html标签的两种隐藏方式

    做一个文章管理模块 有一个功能是需要根据文章分类来显示内容的标签 刚开始以为很简单 ,手放键盘上就是一顿敲. 如果类型是文章就是没问题  可是另外几种就有问题了 红框的标签一直不出来 后来找了半天然来 ...

  8. redis redis-cli 操作指令

    默认选择 db库是 0 redis-cli -p 6379   查看当前所在“db库”所有的缓存key redis 127.0.0.1:6379> keys *   选择 db库 redis 1 ...

  9. 14.2-ELK 经典用法—企业自定义日志收集切割和mysql模块

    本文收录在Linux运维企业架构实战系列 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-02-24 11: ...

  10. pyhon之99乘法表

    1.长方形完整格式 for i in range(1,10): for j in range(1,10): print("%d*%d" %(j,i),end=" &quo ...