hdu1102 克鲁斯卡尔+并查集

来源:互联网 发布:动态桌面主题下载软件 编辑:程序博客网 时间:2024/06/06 16:13
#include <iostream>
#include <cstdio>
#include <cstring>
#include "algorithm"
using namespace std;
int n,pos;
int op[10000];
int ed[10000];
int dis[10000];
int tmp[10000];
int father[110];
int cmp(int a,int b){return dis[a]<dis[b];}
int Find(int a){return father[a]==a?a:father[a]=Find(father[a]);}
int main(void)
{
    int temp,ans;
    while(scanf("%d",&n)!=EOF)
    {
        pos=0;ans=0;
        for(int i=0;i<=n;i++)
            father[i]=i;

        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&temp);
                if(i==j) continue;
                op[pos]=i;ed[pos]=j;dis[pos]=temp;tmp[pos]=pos;
                pos++;
            }
        int cot,a,b;
        scanf("%d",&cot);
        for(int i=0;i<cot;i++)
        {
            scanf("%d%d",&a,&b);
            father[Find(a)]=Find(b);
        }
        sort(tmp,tmp+pos,cmp);
        for(int i=0;i<pos;i++)
        {
            int a=Find(op[tmp[i]]),b=Find(ed[tmp[i]]);
            if(a==b) continue;
            father[a]=b;
            ans+=dis[tmp[i]];
        }
        printf("%d\n",ans);
    }
}

0 0
原创粉丝点击