您的位置:首页 > 其它

HDU 5253 连接的管道

2015-09-20 20:17 302 查看
就是就最小生成树,就是有点坑人
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define N 1005
int a

;
int p[N*N];
int m,n;
int L;
struct node
{
int u,v,c;
}t;
struct node M[N*N*4];//这样更节约内存
int cmp(node p,node q)
{
return p.c<q.c;
}
int find(int k)
{
if(p[k]!=k)
{
return p[k]=find(p[k]);
}
else
{
return p[k];
}

}
int kus()
{
int i,sum=0,cnt=0;
for(i=0; i<L; i++)
{
int x=find(M[i].u);
int y=find(M[i].v);
if(x!=y)
{
p[y]=x;
sum+=M[i].c;
cnt++;
}
if(cnt==m*n-1)
return sum;
}
return sum;
}
int main()
{
int T;
scanf("%d",&T);
int k=1;
while(T--)
{
scanf("%d%d",&m,&n);
int i,j;
L=0;
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
{
scanf("%d",&a[i][j]);
p[i*n+j]=i*n+j;
if(i>0)
{
t.u=i*n+j;
t.v=i*n+j-n;
t.c=abs(a[i][j]-a[i-1][j]);
M[L++]=t;
}
if(j>0)
{
t.u=i*n+j;
t.v=i*n+j-1;
t.c=abs(a[i][j]-a[i][j-1]);
M[L++]=t;
}
}
}
sort(M,M+L,cmp);
int sum=kus();
printf("Case #%d:\n",k++);
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: