连接的管道

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

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
一直没做mst结果建图坑惨我了:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int f[maxn*maxn];
short h[maxn][maxn];                                                                                     //height<100,用short节约内存不然会爆(或者用结构体可以少一个r数组)
int u[2*maxn*maxn],v[2*maxn*maxn],w[2*maxn*maxn],r[2*maxn*maxn];    //最大点数1000*1000,所以最多有2*1000*1000条边
int fx[4][2]={{-1,0},/*{1,0},*/{0,-1}/*,{0,1}*/};                                           //易得只要求左边相邻和上边相邻的点的距离即可表示出所有的边
bool cmp(int i,int j)
{
return w[i]<w[j];
}
int find(int v)
{
return f[v]==v?v:f[v]=find(f[v]);
}
int main()
{
int n,m,i,j,t,k=0;
scanf("%d",&t);
while (t--){int p=0,ans=0,ml=0;
scanf("%d%d",&n,&m);

for (i=1;i<=n*m;i++) f[i]=i;
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
scanf("%d",&h[i][j]);
//cout<<"fuck"<<endl;
for (int xt=0;xt<2;xt++){
int dx=i+fx[xt][0];
int dy=j+fx[xt][1];
if (dx<1||dy<1||dx>n||dy>m) continue;

ml++;
r[++p]=ml;
u[p]=(i-1)*m+j;                                                             //u,v中存的是点的标号(1,2,3,4,5.......n*m),所以记得将二维坐标转化为一维,就是这里坑死我了= =
v[p]=(dx-1)*m+dy;
w[p]=abs(h[i][j]-h[dx][dy]);
//cout<<u[p]<<" "<<v[p]<<" "<<w[p]<<endl;
}
}
}
int temp=0;
sort(r+1,r+p+1,cmp);
for (i=1;i<=p;i++){
int e=r[i];
int x=find(u[e]);
int y=find(v[e]);
if (x!=y) {temp++;
ans+=w[e];
f[x]=y;
}
if (temp==n*m-1) break;
//for (int ki=1;ki<=n*m;ki++) cout<<f[ki]<<" ";cout<<endl;
}
printf("Case #%d:\n%d\n",++k,ans);

}
return 0;
}

hdu5253 MST的更多相关文章

  1. POJ1679 The Unique MST[次小生成树]

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28673   Accepted: 10239 ...

  2. 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)

    怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...

  3. BZOJ 2654 & 玄学二分+MST

    题意: 给一张图,边带权且带颜色黑白,求出一棵至少包含k条白边的MST SOL: 正常人都想优先加黑边或者是白边,我也是这么想的...你看先用白边搞一棵k条边的MST...然后维护比较黑边跟白边像堆一 ...

  4. LA 5713 秦始皇修路 MST

    题目链接:http://vjudge.net/contest/144221#problem/A 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不 ...

  5. [poj1679]The Unique MST(最小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28207   Accepted: 10073 ...

  6. [BZOJ2654]tree(二分+MST)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...

  7. CodeForces 125E MST Company

    E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...

  8. 2015baidu复赛2 连接的管道(mst && 优先队列prim)

    连接的管道 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. ACM/ICPC 之 判别MST唯一性-Kruskal解法(POJ1679)

    判别MST是否唯一的例题. POJ1679-The Unique MST 题意:给定图,求MST(最小生成树)是否唯一,唯一输出路径长,否则输出Not Unique! 题解:MST是否唯一取决于是否有 ...

随机推荐

  1. 【JAVASCRIPT】获取触发MESSAGE事件的源IFRAME

    先让发送源获取焦点,然后获取焦点元素. window.addEventListener('message',function(msg){ //做一些事来判断是不是某个iframe发送的消息 msg.s ...

  2. 0-5v转0-20ma和0-5v转4-20ma

    0-5v转0-20ma 0-5v转4-20ma

  3. Nginx服务器之负载均衡策略(6种)

    一.关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器.详情请查看我的另一篇博客. 二.Ng ...

  4. Python Web学习笔记之TCP/IP、Http、Socket的区别

    经常在笔试.面试或者工作的时候听到这些协议,虽然以前没怎么涉及过,但至少知道这些是和网络编程密不可分的知识,作为一个客户端开发程序员,如果可以懂得网络编程的话,他的作用和能力肯定会提升一个档次.原因很 ...

  5. POJO/VO/DTO等对象模型

    JavaBean 要想成为JavaBean,需要满足以下条件: 1,提供一个默认的无参构造函数. 2,需要被序列化并且实现了Serializable接口. 3,可能有一系列可读写属性伴随"g ...

  6. Java实现Sybase数据库连接

    Java实现Sybase数据库连接 需要的jar包:jconn4.jar: Java代码: /** * @Title: getConnSybase * @Description: * @param * ...

  7. Linux系统的vi命令

    Linux系统的vi命令 vi编辑命令 1,格式: #vi filename 2,用法: //打开或新建文件,并将光标置于第一行首 #vi + filename //打开文件,并将光标置于第n行首 # ...

  8. 车载项目问题解(memset)

    1memset函数解 1.void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c.2.例子 #includevoid ...

  9. Ansible 入门指南 - 学习总结

    概述 这周在工作中需要去修改 nginx 的配置,发现了同事在使用 ansible 管理者系统几乎所有的配置,从数据库的安装.nginx 的安装及配置.于是这周研究起了 ansible 的基础用法.回 ...

  10. Centos7.2 修改网卡名称

    查看ip [root@localhost network-scripts]# ip addr : lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue ...