连接的管道

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1643    Accepted Submission(s): 603

Problem Description
老 Jack 有一片农田,以往几年都是靠天吃饭的。但是今年老天格外的不开眼,大旱。所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了。当老 Jack 买完所有铺设在每块农田内部的管道的时候,老 Jack 遇到了新的难题,因为每一块农田的地势高度都不同,所以要想将两块农田的管道链接,老 Jack 就需要额外再购进跟这两块农田高度差相等长度的管道。

现在给出老 Jack农田的数据,你需要告诉老 Jack 在保证所有农田全部可连通灌溉的情况下,最少还需要再购进多长的管道。另外,每块农田都是方形等大的,一块农田只能跟它上下左右四块相邻的农田相连通。

Input
第一行输入一个数字T(T≤10),代表输入的样例组数

输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 N,M(1≤N,M≤1000),代表老 Jack 有N行*M列个农田。接下来 N 行,每行 M 个数字,代表每块农田的高度,农田的高度不会超过100。数字之间用空格分隔。

Output
对于每组测试数据输出两行:

第一行输出:"Case #i:"。i代表第i组测试数据。

第二行输出 1 个正整数,代表老 Jack 额外最少购进管道的长度。

Sample Input
2 4 3 9 12 4 7 8 56 32 32 43 21 12 12 2 3 34 56 56 12 23 4
Sample Output
Case #1: 82 Case #2: 74
不愧是百度之星的题,尽管是初赛,不过题目还是很有营养的,两次re三次超内存,终于过了:
这是一个最小生成树,这里用的库鲁斯卡尔算法,建图方面出现了问题,
此题目图很难建,首先点的计数就有点乱,比如说m行n列的矩阵,从第一行开始是
1 2 3 4 . . . n
n+1 n+2 n+3 n+4 ...n*2
....
等等 可以得到第i行第j个点的计数是i*n+j-n;
然后我用的方法是简化了运算的,只计算一个点下边的和右边的存入结构体,但是最后一行和最后一列需要单独考虑,最后一行的话,只需要计算其右边的即可,
最后一列的话需要判断其下边的即可,
但是 我用了双向建图,导致了超内存,后来想了想,根据库鲁斯卡尔算法的特点,不需要双向建图,看来知识必须得理解的透彻啊。
附代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct node//库鲁斯卡尔算法
{int start;int end;int cost;
}t[2010000];
int cmp(node a,node b)
{return a.cost<b.cost;
}
int per[1010*1010];
int map[1010][1010];
int find(int x)
{int r=x;if(per[r]==r)return r;return per[r]=find(per[r]);
}
int join(int x,int y)
{int fx=find(x);int fy=find(y);if(fx!=fy){per[fx]=fy;return 1;} return 0;
}
int m,n,i,j,k,l,p,flag=1;
int main()
{scanf("%d",&p);while(p--){memset(t,0,sizeof(t));memset(map,0,sizeof(map));scanf("%d%d",&m,&n);for(i=0;i<=n*m+m+n;i++)per[i]=i;for(i=1;i<=m;i++)for(j=1;j<=n;j++)scanf("%d",&map[i][j]);int sum=0;for(i=1;i<m;i++)//建图时只需要判断一个点的右边和下边即可,并双向建图; for(j=1;j<n;j++){t[sum].start=n*i+j-n;//当前点 t[sum].end=n*i+j+1-n;//当前点右边的点 t[sum++].cost=abs(map[i][j]-map[i][j+1]);//t[sum].end=n*i+j-n;//原先建的双向图,其实不需要 ,所以超内存的问题就解决了 //t[sum].start=n*i+j+1-n;//  t[sum++].cost=abs(map[i][j]-map[i][j+1]);t[sum].start=n*i+j-n;//当前点 t[sum].end=n*i+j+n-n;//当前点下边的点 t[sum++].cost=abs(map[i][j]-map[i+1][j]);//t[sum].end=n*i+j-n;//  t[sum].start=n*i+j+n-n;//    t[sum++].cost=abs(map[i][j]-map[i+1][j]);}for(j=1;j<n;j++)//针对最后一行 {t[sum].start=n*m+j-n;t[sum].end=n*m+j-n+1;//只需判断当前点右边的点 t[sum++].cost=abs(map[m][j]-map[m][j+1]);//t[sum].end=n*m+j-n;//t[sum].start=n*m+j-n+1;//t[sum++].cost=abs(map[m][j]-map[m][j+1]);}for(i=1;i<m;i++)//针对最后一列 {t[sum].start=i*n;t[sum].end=i*n+n;//只需判断当前点下边的店即可 t[sum++].cost=abs(map[i][n]-map[i+1][n]);t[sum].end=i*n;t[sum].start=i*n+n;t[sum++].cost=abs(map[i][n]-map[i+1][n]);}sort(t,t+sum,cmp);__int64 ans=0;for(i=0;i<sum;i++){if(join(t[i].start,t[i].end))ans+=t[i].cost;}printf("Case #%d:\n",flag++); printf("%I64d\n",ans);}return 0;
}

杭电5253连接的管道相关推荐

  1. 杭电 1272 poj 1308 小希的迷宫

    这道题是我学了并查集过后做的第三个题,教我们的学姐说这是并查集的基础题,所以有必要牢牢掌握. 下面就我做这道题的经验,给大家一些建议吧!当然,我的建议不是最好的,还请各位大神指出我的错误来,我也好改正 ...

  2. 杭州电子科技大学-杭电信标一队

    第一章 引言 全国大学生智能汽车竞赛是一项面向全国大学生以智能汽车为研究对象的科技竞赛,以"立足培养,重在参与,鼓励探索, 追求卓越"为指导思想.比赛形式有信标组.创意组等多种. ...

  3. 杭电1325java实现

    题目链接 问题描述 树是一个众所周知的数据结构,它可以是空的(null,void,nothing),也可以是一组由节点之间的有向边连接起来的一个或多个节点,满足以下属性. 只有一个节点称为根,没有有向 ...

  4. 杭电1232 畅通工程

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通 ...

  5. 17届技术报告 | 杭电四轮点此一队

    01 引言 1.1 概述 全国大学生智能车竞赛以"立足培养,重在参与,鼓励探索,追求卓越"为指导思想,涵盖了机械.模式识别.电子.电气.传感技术.计算机.自动化控制.汽车理论等多方 ...

  6. 2021杭电多校第八场补题

    比赛传送门:Contest Problem List (hdu.edu.cn) 1006)GCD Game 题目翻译:爱丽丝和鲍勃正在玩游戏. 他们轮流操作.有n个数字,a1,a2,...,an.每次 ...

  7. 2022杭电多校赛第八场

    2022杭电多校赛第八场 文章目录 2022杭电多校赛第八场 1004.Quel'Thalas 1001.Theramore 1011.Stormwind 1008.Orgrimmar 1005.Ir ...

  8. 2022“杭电杯”中国大学生算法设计超级联赛(8)

    2022"杭电杯"中国大学生算法设计超级联赛(8) [题目链接](Search Result (hdu.edu.cn)) D Quel'Thalas 题目大意 在二维平面上,[0, ...

  9. 杭电1856——并差集

    杭电1856--并差集 原题传送门,并差集的简单介绍,大佬并差集详解. 解题思路: 这个算并差集的裸题吧.先将输入的数据(还没有连接的数据)全部用meg函数连起来,然后用fin函数遍历每个男孩最上面的 ...

最新文章

  1. mysql的索引优化_MySQL索引优化与分析(重要)
  2. pyglet and opengl -- 纹理映射以及动画
  3. 10.MYSQL:什么是事务?事务的性质?事务的应用?
  4. flask和ajax,Flask flash和url_用于AJAX
  5. 常见开发需求之前端利器webstorm中的git和快捷键
  6. linux 常用命令及操作
  7. 2019-OO-第二单元总结
  8. (转)Spring Boot 2(一):【重磅】Spring Boot 2.0权威发布
  9. vue中v-model的使用
  10. C# windows身份验证的连接字符串!
  11. Deepin linux 15.9.1 Ubuntu 16.04 安装zsteg、gem
  12. php滑动门效果,js实现简洁的TAB滑动门效果代码
  13. 用导入导出模板生成系统标准功能单据--销售订单
  14. 移动端用户设置字体放大导致的问题
  15. 帅地鸽了大半年,一个专注于面试、基础知识、算法的小破站上线了
  16. 阿里巴巴erp【商业化操作系统】什么是erpadmin
  17. JDBC Statement RETURN_GENERATED_KEYS返回自动生成的ID
  18. 2012春节回乡见闻
  19. 【说透中台】05 | D4模型:中台规划建设方法论概述
  20. 有没有人可以帮我解析一下下面的json

热门文章

  1. 安卓中的@Nullable和NonNull(NotNull) 等 注释
  2. 崛起于Springboot2.X之redis集群搭建(17)
  3. 右键打开方式添加应用程序无法设置
  4. at/cron计划任务初解
  5. NEON在Android中的使用举例【转】
  6. 如何重置 RHEL7/CentOS7 系统的密码
  7. 《MPLS在Cisco IOS上的配置》一第 1 章 MPLS概述1.1 IP转发过程概述
  8. struts2 OGNL表达式
  9. C# WinForm WebBrowser (三) 编辑模式
  10. linux ----Inode的结构图