题目名称 512. 扩散
输入输出 ppg.in/out
难度等级 ★☆
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 10
题目来源 Gravatarcqw 于2010-11-18加入
开放分组 全部用户
提交状态
分类标签
最小生成树 并查集
分享题解
通过:50, 提交:129, 通过率:38.76%
Gravatar+1s 100 0.000 s 0.00 MiB C++
Gravatarxxcxcxcx 100 0.000 s 0.00 MiB C++
GravatarLGLJ 100 0.000 s 0.00 MiB C++
Gravatar王者自由 100 0.002 s 0.17 MiB Pascal
Gravatar0-0 100 0.002 s 0.17 MiB Pascal
Gravatar苏轼 100 0.002 s 0.17 MiB Pascal
Gravatarliu_runda 100 0.002 s 0.30 MiB C++
Gravatarty_c7x1 100 0.002 s 0.33 MiB C++
Gravataryushi 100 0.003 s 0.26 MiB C++
Gravatarzjmfrank2012 100 0.003 s 0.28 MiB C++
本题关联比赛
20101118
关于 扩散 的近10条评论(全部评论)
这题的prim不加堆优化貌似会快一点
Gravatarliu_runda
2016-03-11 10:49 4楼
弱菜使用并查集写的...Max表示当前时间,对于每两个点都更新Max值

Max=max(Max,Max+distance[i][j]/2+distance[i][j] Mod 2-Max)
注意distance[i][j]/2+distance[i][j]Mod2表示的是两点到最近公共点的曼哈顿距离.减去Max表示减去已经扩散的距离.
看上去挺麻烦其实就是维护不断增加Max的值直到并查集只剩下一个集合为止(所有的元素都成了一个连通块)
注意distance的值存放在一个一维的不下降数组里,否则就会有答案变大的情况
GravatarQhelDIV
2012-06-19 18:24 3楼
自主构图+最小生成树,
因为用邻接矩阵存的图(似乎用邻接表构图会很麻烦……),
再加上图是一个不折不扣的稠密图(本来就是完全图),
用的普里姆算法。(克鲁斯卡尔算法适用于稀疏图,用邻接表的图)。
这里普里姆是用的“不完全”队列操作实现的,感觉应该是普里姆算法中最简单最快的实现方法了。
GravatarTruth.Cirno
2011-11-09 08:31 2楼
找题解,上http://paulinsider.at.ua/news/ppg/2011-11-08-8,快,稳,准,大牛的选择!!
用prim
Gravatar苏轼
2011-11-09 08:26 1楼

512. 扩散

★☆   输入文件:ppg.in   输出文件:ppg.out   简单对比
时间限制:1 s   内存限制:128 MiB

【问题描述】
在平面上有n个点,一个点每过一个单位时间就会向4个方向(上下左右)扩散一个距离,如下图所示:

两个点a和b连通,记作e(a,b),当且仅当a、b的扩散区域有公共部分。连通块的定义是块内的任意两个点u、v都必定存在路径e(u,a0),e(a0,a1),……e(ak,v)。给定平面上n个点的坐标,问最早什么时刻它们形成一个连通块。
【输入文件】
第一行一个数:n
下面n行,每行两个整数x,y,代表一个点的坐标。
【输出文件】
一个整数,表示最早的时刻所有点形成的连通块。
【样例输入】
2
0 0
5 5
【样例输出】
5
【数据规模】
对于20%的数据,满足1<=n<=5; 1<=x[i],y[i]<=50;
对于100%的数据,满足1<=n<=50;1<=x[i],y[i]<=10^9