zoukankan      html  css  js  c++  java
  • hdu 1102 Constructing Roads

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    struct data
    {
        int u,v,w;
    }e[105*105];
    int bin[100+5],use[100+5][100+5],mp[100+5][100+5];
    bool cmp(data a,data b)
    {
        return a.w<b.w;
    }
    
    int Find(int x)
    {
        int s;
        for(s=x;bin[s]>=0;s=bin[s]);
    
        while(s!=x)
        {
            int t=bin[x];
            bin[x]=s;
            x=t;
        }
        return s;
    }
    
    void Union(int x1,int x2)
    {
        int f1=Find(x1),f2=Find(x2);
        int temp=bin[f1]+bin[f2];
        if(bin[f1]>bin[f2])
        {
            bin[f1]=f2;
            bin[f2]=temp;
        }
        else
        {
            bin[f2]=f1;
            bin[f1]=temp;
        }
    }
    
    int main()
    {
        int n,i,j,u,v,w,m,k,a,b;
        while(~scanf("%d",&n))
        {
            for(i=0;i<=n;i++) bin[i]=-1;
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                {
                    scanf("%d",&mp[i][j]);
                }
            }
    
            scanf("%d",&k);
            memset(use,0,sizeof(use));
            for(i=0;i<k;i++)
            {
                scanf("%d%d",&a,&b);
                if(Find(a)!=Find(b)) Union(a,b);
                use[a][b]=use[b][a]=1;
            }
            m=0;
            for(i=1;i<=n;i++)
            {
                use[i][i]=1;
                for(j=1;j<=n;j++)
                {
                    if(use[i][j]==0&&use[j][i]==0)
                    {
                        e[m].u=i;
                        e[m].v=j;
                        e[m].w=mp[i][j];
                        use[i][j]=use[j][i]=1;
                        m++;
                    }
                }
            }
            sort(e,e+m,cmp);
            int sum=0;
            for(i=0;i<m;i++)
            {
                u=e[i].u;
                v=e[i].v;
                if(Find(u)!=Find(v))
                {
                    Union(u,v);
                    sum+=e[i].w;
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    04 SecurityContextHolder与SecurityContext说明
    03 spring security执行流程分析
    02 spring security 自定义用户认证流程
    01 spring security入门篇
    第三周进度
    第二周进度
    一维整数组所有子数组和的最大值
    初入园子,自我介绍
    密码登录源码(jsp+java+数据库)
    第一周总结
  • 原文地址:https://www.cnblogs.com/xryz/p/4847917.html
Copyright © 2011-2022 走看看