|
连接的管道 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 老 Jack 有一片农田,以往几年都是靠天吃饭的。但是今年老天格外的不开眼,大旱。所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了。当老 Jack 买完所有铺设在每块农田内部的管道的时候,老 Jack 遇到了新的难题,因为每一块农田的地势高度都不同,所以要想将两块农田的管道链接,老 Jack 就需要额外再购进跟这两块农田高度差相等长度的管道。
Input 第一行输入一个数字
T(T≤10)
,代表输入的样例组数
Output 对于每组测试数据输出两行:
Sample Input 2 4 3 9 12 4 7 8 56 32 32 43 21 12 12 2 3 34 56 56 12 23 4
Sample Output Case #1: 82 Case #2: 74 |
#include <stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int sum;
int bin[2000001];
int chun[1001][1001];
struct node{
int s,e,w;
}a[2000001];
int finx(int x)
{
return x==bin[x]?x:bin[x]=finx(bin[x]);
}
int merge(int x,int y,int z)
{
int fx=finx(x);
int fy=finx(y);
if(fx!=fy)
{
bin[fx]=fy;
sum+=z;
}
}
int cmp(node x,node y)
{
return x.w<y.w;
}
int k=0;
int main(int argc, char *argv[])
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d %d",&n,&m);
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&chun[i][j]);
int flag=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(i!=n-1)
{
a[flag].s=i*m+j;
a[flag].e=i*m+j+m;
a[flag++].w=abs(chun[i][j]-chun[i+1][j]);
}
if(j!=m-1)
{
a[flag].s=i*m+j;
a[flag].e=i*m+j+1;
a[flag++].w=abs(chun[i][j]-chun[i][j+1]);
}
}
}
for(i=0;i<n*m;i++)
bin[i]=i;
sort(a,a+flag,cmp);
sum=0;
for(i=0;i<flag;i++)
{
merge(a[i].s,a[i].e,a[i].w);
}
printf("Case #%d:\n",++k);
printf("%d\n",sum);
}
return 0;
}