码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-02 20:11:10      阅读:575      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

分析:并查集实现最小生成树。不能用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;      
}


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

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46334301

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!