POJ 1258(最小生成树kruskal模板)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <iomanip>
#include <map>
using namespace std;
const int mmax=200;
struct node{
    int a,b,price;
};
int par[mmax],rank[mmax],n;
vector<node>e;
void init()
{
    for(int i=0;i<=n;i++)
    {
        rank[i]=0;
        par[i]=i;
    }
}
int find(int x)
{
    if(par[x]==x)
        return x;
    else
        return par[x]=find(par[x]);
}
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)
    return;
    if(rank[x]<rank[y])
        par[x]=y;
    else
    {
        par[y]=x;
        if(rank[x]==rank[y])
        rank[x]++;
    }
}
bool cmp(node a,node b)
{
    return a.price<b.price;
}
int main(int argc, char *argv[])
{
    int ans,cout;
    while(scanf("%d",&n)!=EOF)
    {
        cout=0;
        e.clear();
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                int t;
                scanf("%d",&t);
                if(i!=j)
                {
                    node k;
                    k.a=i;
                    k.b=j;
                    k.price=t;
                    e.push_back(k);
                    cout++;
                }
                
            }
        }    
        sort(e.begin(),e.end(),cmp);
        init();
        ans=0;
        int ne=0;
        for(int i=0;i<cout;i++)
        {
            if(find(e[i].a)!=find(e[i].b))
            {
                unite(e[i].a,e[i].b);
                ans+=e[i].price;
                ne++;
            }
        }
        if(ne==n-1)
        printf("%d\n",ans);
        else
        printf("-1\n");
    }
    
    return 0;
}

 

posted @ 2018-10-15 17:38  huluxin  阅读(389)  评论(0编辑  收藏  举报