【HDU】5253-连接的管道(并查集)

十分简单的并查集问题,注意建图的方式

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1005;
const int maxd = 5000005;
const int dir[2][2] = {{0,1},{1,0}};
int n,m,mat[maxn][maxn],cnt,fa[maxd];
struct Node{
    int u,v,d;
    friend bool operator < (Node p,Node q){
        return p.d < q.d;
    }
}edge[maxd];
void init(){
    for(int x = 0; x < n; x++)
        for(int y = 0; y < m; y++){
            for(int d = 0; d < 2; d ++){
                int xx = x + dir[d][0];
                int yy = y + dir[d][1];
                if(xx >= 0 && xx < n && yy >= 0 && yy < m){
                    edge[cnt].u = x * m + y;
                    edge[cnt].v = xx * m + yy;
                    edge[cnt].d = abs(mat[xx][yy] - mat[x][y]);
                    cnt ++;
                }
            }
        }
}
int find_father(int u){
    return fa[u] == u ? u : fa[u] = find_father(fa[u]);
}
int main(){
    int T,Case = 1;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        cnt = 0;
        int t = n * m;
        for(int i = 0; i <= t; i ++) fa[i] = i;
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)
                scanf("%d",&mat[i][j]);
        init();
        sort(edge,edge + cnt);
        int ans = 0;
        printf("Case #%d:\n",Case++);
        for(int i = 0; i < cnt; i++){
            int f1 = find_father(edge[i].u);
            int f2 = find_father(edge[i].v);
            if(f1 != f2){
                //printf("%d %d %d\n",edge[i].u,edge[i].v,edge[i].d);
                ans += edge[i].d;
                fa[f1] = f2;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-08 10:19:54

【HDU】5253-连接的管道(并查集)的相关文章

hdu 5253 连接的管道

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5253 连接的管道 Description 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老天格外的不开眼,大旱.所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了.当老 Jack 买完所有铺设在每块农田内部的管道的时候,老 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 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 连接的管道(百度之星初赛)

题意:n*m的矩阵,每个格子有一个值代表高度,现在需要灌溉所有的格子,管子的长度为高度差,求最小的管长之和: 思路:最小生成树kru算法,保存每个点到其左边和上边的点的高度差,比赛时想不到: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int mm[1010][1010]; int fa[9000100]; int t,

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 3461 Code Lock(并查集的应用+快速幂)

* 65536kb,只能开到1.76*10^7大小的数组.而题目的N取到了10^7,我开始做的时候没注意,用了按秩合并,uset+rank达到了2*10^7所以MLE,所以貌似不能用按秩合并. 其实路径压缩也可以不用.............  题目的大意: 一个密码锁上有编号为1到N的N个字母,每个字母可以取26个小写英文字母中的一个.再给你M个区间[L,M],表示该区间的字母可以一起同步"增加"(从'a'变为'b'为增1,'z'增1为'a').假如一组密码按照给定的区间进行有限

HDU 3635 延缓更新的并查集

Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2839    Accepted Submission(s): 1097 Problem Description Five hundred years later, the number of dragon balls will increase unexpecte

HDU 1558 Segment set (并查集+线段非规范相交)

题目链接 题意 : 如果两个线段相交就属于同一集合,查询某条线段所属集合有多少线段,输出. 思路 : 先判断与其他线段是否相交,然后合并. 1 //1558 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <cmath> 6 #define eps 1e-8 7 #define zero(x) (((x) > 0 ? (x) : (-x)) < e

HDU ACM 5253 连接的管道-&gt;最小生成树(并查集)

分析:并查集实现最小生成树.不能用cin和cout(使用了ios::sync_with_stdio(false);都不行),否则TLE. #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define N 1005 int father[N*N]; struct EDGE { int u,v; int len; bool operator<(const EDGE