2015baidu复赛2 连接的管道(mst && 优先队列prim)
连接的管道
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 222 Accepted Submission(s): 75
Jack 有一片农田,以往几年都是靠天吃饭的。但是今年老天格外的不开眼,大旱。所以老 Jack
决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了。当老 Jack 买完所有铺设在每块农田内部的管道的时候,老
Jack 遇到了新的难题,因为每一块农田的地势高度都不同,所以要想将两块农田的管道链接,老 Jack
就需要额外再购进跟这两块农田高度差相等长度的管道。
现在给出老 Jack农田的数据,你需要告诉老 Jack 在保证所有农田全部可连通灌溉的情况下,最少还需要再购进多长的管道。另外,每块农田都是方形等大的,一块农田只能跟它上下左右四块相邻的农田相连通。
输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 N,M(1≤N,M≤1000),代表老 Jack 有N行*M列个农田。接下来 N 行,每行 M 个数字,代表每块农田的高度,农田的高度不会超过100。数字之间用空格分隔。
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出 1 个正整数,代表老 Jack 额外最少购进管道的长度。
4 3
9 12 4
7 8 56
32 32 43
21 12 12
2 3
34 56 56
12 23 4
82
Case #2:
74
#include<bits/stdc++.h>
const int M = 1e3 + , inf = 0x3f3f3f3f ;
int move[][] = {{,} , {,} , {-,} , {,-}} ;
struct node
{
int id , dis ;
bool operator < (const node &rhs) const {
return rhs.dis < dis ;
}
} ;
std::priority_queue <node> q ;
int d[M * M] ;
int mp[M][M] ;
int n , m , T ; void init ()
{
for (int i = ; i < M * M ; i ++) {
d[i] = inf ;
}
} void prim ()
{
while (!q.empty ()) q.pop () ;
for (int i = ; i < ; i ++) {
int x = move[i][] , y = move[i][] ;
if (x >= n || y >= m || x < || y < ) continue ;
int dis = fabs (mp[][] - mp[x][y]) ;
q.push ( (node) {x * m + y , dis} ) ;
d[x * m + y] = dis ;
}
d[] = - ;
int sum = ;
while (!q.empty ()) {
node ans = q.top () ;
int id = ans.id , dis = ans.dis ;
q.pop () ;
if (~ d[id] == ) continue ;
d[id] = - ;
sum += dis ;
for (int i = ; i < ; i ++) {
int sx = id / m , sy = id % m ;
int x = sx + move[i][] , y = sy + move[i][] ;
if (x >= n || y >= m || x < || y < ) continue ;
int _id = x * m + y , _dis = fabs (mp[sx][sy] - mp[x][y]) ;
if ( ~d[_id] && d[_id] > _dis) {
d[_id] = _dis ;
q.push ((node) {_id , _dis}) ;
}
}
// for (int i = 0 ; i < n * m ; i ++) printf ("%d , " , d[i]) ; puts ("") ;
}
printf ("%d\n" , sum) ;
} int main ()
{
//freopen ("a.txt" , "r" , stdin ) ;
scanf ("%d" , &T) ;
int cas = ;
while (T --) {
init () ;
printf ("Case #%d:\n" , cas ++) ;
scanf ("%d%d" , &n , &m) ;
for (int i = ; i < n ; i ++) {
for (int j = ; j < m ; j ++) {
scanf ("%d" , &mp[i][j]) ;
}
}
prim () ;
}
return ;
}
一看到就是mst,但是我被寒假集训时的写法深深伤害到,O(V^E) , 当时却跑得如此愉快。
赛后从岐哥听说prim能用优先队列优化:墨迹墨迹出了这个 92_prim , 复杂度为 O(E * logE)总体来说很漂亮=。=
还有就是预处理强迫症,一开始硬是找了个vector把整幅图去保存,结果mle到死,事实上根本不需要vector做预处理。
2015baidu复赛2 连接的管道(mst && 优先队列prim)的更多相关文章
- hdu 5253 连接的管道
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5253 连接的管道 Description 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老 ...
- HDU 5253 连接的管道 (最小生成树)
连接的管道 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HTTP协议----URI,URL,持久连接,管道与Cookie
URI与URL有什么不同呢? URI:Universal Resource Identifier统一资源标志符 URL:Universal Resource Locator统一资源定位器 URI是用来 ...
- Kruskal 2015百度之星初赛2 HDOJ 5253 连接的管道
题目传送门 /* 最小生成树(Kruskal):以权值为头,带入两个端点,自然的排序;感觉结构体的并查集很好看 注意:题目老头要的是两个农田的高度差,中文水平不好,题意理解成和平均值的高度差! */ ...
- hdu 5253 连接的管道(kruskal)(2015年百度之星程序设计大赛 - 初赛(2))
连接的管道 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU 5253 连接的管道(Kruskal算法求解MST)
题目: 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老天格外的不开眼,大旱.所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了.当老 J ...
- python Nosql-redis 连接、管道
非关系型数据库和关系型数据库的差别: 非关系型数据库的优势: 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高. 可扩展性同样也是因为基于 ...
- 2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)
矩形面积 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- MST(最小生成树)——Prim算法——HDU 1879-继续畅通工程
Prim算法很好理解,特别是学完了迪杰斯特拉算法之后,更加能理解Prim的算法思想 和迪杰斯特拉算法差不多,由于最后要形成连通图,故任意指定一个点,作为初始点,遍历所有点,以当前最小权值的点(和迪杰斯 ...
随机推荐
- 踩的python列表及for循环一个坑儿
一个列表循环的问题,困扰了半个小时,我也是醉了,值得深思 下面开始提需求: 一个列表mylist = [{'tag':1,'num' :5000},{'tag':2,num: 6000},{'tag' ...
- 关于Unity3d粒子系统的小发现(天堂3技能释放)
导入系统给的粒子包,发现了一个问题:系统的粒子都有移动轨迹. 而自己新建的空粒子系统却没有这个功能.顺便也复习一下粒子系统. Particle System (粒子系统): Duration(持续时间 ...
- codevs 3143 二叉树的序遍历
传送门 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 Input 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i行的两个整数Li和Ri代表编号为i的 ...
- log4net配置和获取ILog实例
名称 描述 File 文件路径,如果RollingStyle为Composite或Date,则这里设置为目录,文件名在DatePattern里设置,其他则这里要有文件名.已经扩展支持虚拟目录 Roll ...
- 软件工程个人作业-Week2
第一部分 调研, 评测 必应词典客户端版本:安卓版5.2.2 bug描述一:在学习页面点击“单词挑战”或“我爱说英语”会弹出“加载失败,请稍后重试”,无论点击多少次都加载不出来. bug描述二:在未 ...
- 如果将CTE 用在属于批处理的一部分的语句中
declare @s nvarchar(3) set @s = 'C%' ; -- 必须加分号with t_tree as ( select CountryRegionCode from person ...
- 如何修改Linux主机名
Linux 下什么都比较麻烦,就连修改主机名也不例外.我们就下文说一下具体方法. Linux 安装好后,其默认的主机名是 localhost.修改 Linux 主机名需要3步. 使用 hostname ...
- 爬虫5 html下载器 html_downloader.py
#coding:utf8 import urllib2 __author__ = 'wang' class HtmlDownloader(object): def download(self, url ...
- url下载网页的三种方法
# -*- coding: utf-8 -*- import cookielib import urllib2 url = "http://www.baidu.com" print ...
- Java——包的概念及使用
package是在使用多个类或接口时,为了避免名称重复而采用的一种措施,直接在程序中加入package关键字即可 编译语法: javac -d . HelloWord.java -d:表示生成目录,生 ...