zoukankan      html  css  js  c++  java
  • HDU 5253 最小生成树(kruskal)+ 并查集

    题目链接


    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define N 1000010
    using namespace std;
    struct node
    {
        int a;//端点1
        int b;//端点2
        int num;//权值
    };
    bool cmp(node x,node y)//按权值升序
    {
        return x.num<y.num;
    }
    int maps[1003][1003];
    node edge[N*2];//边数=2mn-m-n<2mn
    int father[N];
    int r[N];
    int finds(int x)
    {
        if(father[x]!=x)
        father[x]=finds(father[x]);
        return father[x];
    }
    void connect(int a,int b)
    {
        if(r[a]>r[b])
        father[b]=a;
        else if(r[a]<r[b])
        father[a]=b;
        else
        {
            father[a]=b;
            r[b]++;
        }
    }
    int main()
    {
        int T,cas=1,n,m,ans,id;
        int i,j;
        scanf("%d",&T);
        while(T--)
        {
            int numedge=0;//边数
            ans=0;
            memset(r,0,sizeof(r));
            scanf("%d%d",&n,&m);
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                scanf("%d",&maps[i][j]);
            }
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    id=(i-1)*m+j;
                    father[id]=id;
                    if(i<n)//除最后一行外
                    {
                        numedge++;
                        edge[numedge].a=id;
                        edge[numedge].b=i*m+j;
                        edge[numedge].num=abs(maps[i][j]-maps[i+1][j]);
                    }
                    if(j<m)//除最后一列外
                    {
                        numedge++;
                        edge[numedge].a=id;
                        edge[numedge].b=(i-1)*m+j+1;
                        edge[numedge].num=abs(maps[i][j]-maps[i][j+1]);
                    }
                }
            }
            sort(edge+1,edge+numedge+1,cmp);//权值排序
            for(i=1;i<=numedge;i++)
            {
                int x=finds(edge[i].a);
                int y=finds(edge[i].b);
                if(x!=y)
                {
                    connect(x,y);
                    ans+=edge[i].num;
                }
            }
            printf("Case #%d:
    %d
    ",cas++,ans);
        }
        return 0;
    }
    


  • 相关阅读:
    一些简单的问题
    WebRTC的 windows 7 环境搭建
    HTML常用标签
    参考C#编程规范
    C#窗体调用(转载)
    java中的小知识(不断更行中。。。。。)
    CF1483E Vabank 题解
    CF755G PolandBall and Many Other Balls 题解
    CF1483D Useful Edges 题解
    CF1368F Lamps on a Circle 题解
  • 原文地址:https://www.cnblogs.com/westwind1005/p/5975231.html
Copyright © 2011-2022 走看看