hdu 5253 连接的管道(百度之星初赛)

题意:n*m的矩阵,每个格子有一个值代表高度,现在需要灌溉所有的格子,管子的长度为高度差,求最小的管长之和;

思路:最小生成树kru算法,保存每个点到其左边和上边的点的高度差,比赛时想不到;

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int mm[1010][1010];
int fa[9000100];
int t,n,m,cnt;
struct node{
  int u,v;
  int len;
  bool operator <(const node& a)const{
    return len<a.len;
  }
};
node edge[5001000];
void init(){
  for(int i=0;i<=n*m;i++){
    fa[i]=i;
  }
}
int f(int x){
    return x==fa[x]?x:fa[x]=f(fa[x]);
}
int combine(int a,int b){
   int t1=f(a);
   int t2=f(b);
   if(t1!=t2){
     fa[t1]=t2;
     return 1;
   }
   return 0;
}
int solve(){
   int sum=0;
   init();
   for(int i=0;i<cnt;i++){
     if(combine(edge[i].u,edge[i].v)){
            sum+=edge[i].len;
     }
   }
   return sum;
}
int main(){
    int i,j,k,ans,pos,cas;
    scanf("%d",&t);
    for(cas=1;cas<=t;cas++){
       scanf("%d%d",&n,&m);
       cnt=0;
       for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            scanf("%d",&mm[i][j]);
            if(i>1){
                edge[cnt].u=(i-1)*m+j;
                edge[cnt].v=(i-1)*m+j-m;
                edge[cnt++].len=abs(mm[i][j]-mm[i-1][j]);
            }
            if(j>1){
                edge[cnt].u=(i-1)*m+j;
                edge[cnt].v=(i-1)*m+j-1;
                edge[cnt++].len=abs(mm[i][j]-mm[i][j-1]);
            }
        }
       }
       //cnt--;
       sort(edge,edge+cnt);
       printf("Case #%d:\n",cas);
       printf("%d\n",solve());
    }
    return 0;
}
时间: 2024-10-14 00:33:53

hdu 5253 连接的管道(百度之星初赛)的相关文章

hdu 5253 连接的管道

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

hdu 5253 连接的管道(kruskal)(2015年百度之星程序设计大赛 - 初赛(2))

连接的管道 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1323    Accepted Submission(s): 519 Problem Description 老 Jack 有一片农田.以往几年都是靠天吃饭的. 可是今年老天格外的不开眼.大旱.所以老 Jack 决定用管道将他的全部相邻的农田全部都串联起来.这样他就能够从远处

HDU 5253 连接的管道(prim+优先队列)

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

HDU 5253 连接的管道 (最小生成树)

连接的管道 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 653    Accepted Submission(s): 268 Problem Description 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老天格外的不开眼,大旱.所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过

hdu 5698 瞬间移动(2016&quot;百度之星&quot; - 初赛(Astar Round2B)——数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5698 瞬间移动 Accepts: 1018 Submissions: 3620 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子

hdu 5251 矩形面积(百度之星初赛1)(计算几何)

题意:n*4个点,求覆盖所有点的最小矩形面积: 思路:凸包+旋转卡壳,uva10173几乎原题,暂时没写出来,贴一下斌神的码,待补: #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map

Kruskal 2015百度之星初赛2 HDOJ 5253 连接的管道

题目传送门 1 /* 2 最小生成树(Kruskal):以权值为头,带入两个端点,自然的排序;感觉结构体的并查集很好看 3 注意:题目老头要的是两个农田的高度差,中文水平不好,题意理解成和平均值的高度差! 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <vector> 10 #include &l

hdu 4832 百度之星初赛二B

把横的和竖的分开考虑 //#pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<ma

HDU 5701 中位数计数( 2016&quot;百度之星&quot; - 初赛(Astar Round2B) 思维 + 暴力)

传送门 中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 852 Accepted Submission(s): 335 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含