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

分析:并查集实现最小生成树。不能用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& a)const  //从小到达排序
	{
		return len<a.len;
	}
};

EDGE edge[N*N*4];
int map[N][N],m,n,k;

int Find(int x)
{
	return x==father[x]?x:father[x]=Find(father[x]);
}

bool Union(int x,int y)
{
	int a,b;

	a=Find(x);
	b=Find(y);
	if(a!=b)
	{
		father[a]=b;
		return true;
	}
	return false;
}

int process()
{
	int i;
	int sum=0;

	for(i=0;i<k;i++)
		if(Union(edge[i].u,edge[i].v))
			sum+=edge[i].len;
	return sum;
}

int main()
{
	int T,t=0,i,j;
	EDGE e;

	scanf("%d",&T);
	t=0;
	while(T--)
	{
		k=0;
		scanf("%d%d",&m,&n);
		for(i=0;i<m;i++)
			for(j=0;j<n;j++)
			{
				father[i*n+j]=i*n+j;
				scanf("%d",&map[i][j]);

				if(j>0)
				{
					e.u=i*n+j;
					e.v=i*n+j-1;
					e.len=abs(map[i][j]-map[i][j-1]);
					edge[k++]=e;
				}
				if(i>0)
				{
					e.u=i*n+j;
					e.v=i*n+j-n;
					e.len=abs(map[i][j]-map[i-1][j]);
					edge[k++]=e;
				}
			}
		sort(edge,edge+k);
		printf ("Case #%d:\n", ++t);
		printf ("%d\n", process());
	}
    return 0;
}
时间: 2024-10-19 15:56:16

HDU ACM 5253 连接的管道->最小生成树(并查集)的相关文章

HDU ACM : 1875 畅通工程再续-&gt;最小生成树(并查集)

解析:最小生成树:Kruskal 算法:并查集实现. 1.首先找出符合要求的边: 2.对找出的边排序: 3.并查集找出n-1条边,无法修通n-1条路则无法实现要求. #include<iostream> #include<cmath> #include<algorithm> using namespace std; struct Point { int x,y; } point[102]; struct Edge { int a,b; double v; bool op

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 1233 还是畅通工程 kruskal最小生成树并查集实现

http://acm.hdu.edu.cn/showproblem.php?pid=1233 杭电ACM暑期集训队的选拔 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 30319    Accepted Submission(s): 13542 Problem Description 某省调查乡村交通状况,得到的统计表中列

HDU ACM 2586 How far away ?LCA-&gt;并查集+Tarjan(离线)算法

题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w,有m次询问,每次询问房子a,b之间的距离是多少. 分析:最近公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次询问a,b之间的距离=d[a]+d[b]-2*d[LCA(a,b)];LCA(a,b)是a,b的最近公共祖先. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include

【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[max

HDU ACM 1512 Monkey King-&gt;左偏树+并查集

题意:一开始有N只猴子,,每只都有一个力量值.,并且互不认识,后来 它们之间发生了M次斗争. 每次两次两只猴子a,b斗争是, a和 b都会从他们自己的朋友圈里拉出一个最强的朋友, 之后最强的这两只猴子打, 打完后两只猴子的力量值分别减半..并且 两只猴子的朋友圈的所有人都互相认识(也就是以后不会再打了).问题是对于每次斗争, 若a,b是朋友, 那么输出-1, 否则输出斗争后它们的朋友圈里最强猴子的力量值. 分析:要表示集合的合并查找操作就是并查集最好了:要维护每次的最大值,就可以使用大顶堆,但还

hdu 5253 连接的管道

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

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

CSP 201703-4 地铁修建【最小生成树+并查集】

问题描述 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通枢纽之间最多只有一条候选的隧道,没有隧道两端连接着同一个交通枢纽. 现在有n家隧道施工的公司,每段候选的隧道只能由一个公司施工,每家公司施工需要的天数一致.而每家公司最多只能修