HDU-5253-链接的管道

http://acm.hdu.edu.cn/showproblem.php?pid=5253

#include <iostream>
#include <bits/stdc++.h>
#define MAX 1001
using namespace std;
int Map[MAX][MAX];
struct node
{
    int a,b,c;
};
struct node e[MAX*MAX*2+10];
int n,m;
int num = 1;
void add(int i,int j)
{
    if(i<n)
    {
        e[num].a = (i-1)*m+j;
        e[num].b = i*m+j;
        e[num].c = abs(Map[i][j]-Map[i+1][j]);
        num++;
    }
    if(j<m)
    {
        e[num].a = (i-1)*m+j;
        e[num].b = (i-1)*m+(j+1);
        e[num].c = abs(Map[i][j]-Map[i][j+1]);
        num++;
    }
}
bool cmp(node a,node b)
{
    return a.c<b.c;
}
int p[MAX*MAX];
int find(int x)
{
    return p[x]==x?x:p[x] = find(p[x]);
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int k=1;k<=T;k++)
    {

        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&Map[i][j]);
            }
        }
        num=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                add(i,j);
            }
        }
        sort(e+1,e+num,cmp);
        for(int i=1;i<=n*m;i++)
            p[i] = i;
        int sum = 0;
        int edges = 0;
        for(int i=1;i<num;i++)
        {
            int x = find(e[i].a);
            int y = find(e[i].b);
            if(x!=y)
            {
                edges++;
                sum+=e[i].c;
                p[x] = y;
            }
            if(edges==n*m-1)
                break;
        }
        printf("Case #%d:\n%d\n",k,sum);
    }
    return 0;
}

个人失误总结:sort排序范围要严格。

posted @ 2018-08-03 14:33  kpole  阅读(117)  评论(0编辑  收藏  举报