解题思路
这就是一道简单的最小生成树的模板题。只要向左向右去走就行。
代码部分
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
int maps[1010][1010];
int pre[1010*1010];
int n,m,nnt;
struct node
{
int a,b,val;
};
struct node edge[1010*1010*2];
bool cmp(node a,node b)
{
return a.val<b.val;
}
int Find(int x)
{
if(pre[x]==x)
return x;
return pre[x]=Find(pre[x]);
}
int kruskal()
{
int i,sum=0,cnt=0;
sort(edge,edge+nnt,cmp);
for(i=0; i<nnt; i++)
{
int fx=Find(edge[i].a);
int fy=Find(edge[i].b);
if(fx==fy)
continue;
else
{
pre[fy]=fx;
sum+=edge[i].val;
cnt++;
}
if(cnt==n*m-1)
return sum;
}
return sum;
}
int main()
{
int t;
int cas=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int i,j;
nnt=0;
int num=n*m;
for(i=1; i<=num; i++)
pre[i]=i;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&maps[i][j]);
}
}
for(i=1; i<n; i++)
{
int h=(i-1)*m;
for(j=1; j<m; j++)
{
edge[nnt].a=h+j;
edge[nnt].b=h+j+1;
edge[nnt++].val=abs(maps[i][j]-maps[i][j+1]);
edge[nnt].a=h+j;
edge[nnt].b=h+j+m;
edge[nnt++].val=abs(maps[i][j]-maps[i+1][j]);
}
edge[nnt].a=h+m;
edge[nnt].b=h+m+m;
edge[nnt++].val=abs(maps[i][m]-maps[i+1][m]);
}
for(j=1; j<m; j++)
{
edge[nnt].a=(n-1)*m+j;
edge[nnt].b=(n-1)*m+j+1;
edge[nnt++].val=abs(maps[n][j]-maps[n][j+1]);
}
int ans=kruskal();
printf("Case #%d:\n",cas++);
printf("%d\n",ans);
}
return 0;
}