Kruskal 板子

Posted on 2017-11-07 15:00  Murs  阅读(165)  评论(0)    收藏  举报

kruskal

#include<bits/stdc++.h>
#define F(i,s,e) for(int i=s;i<=e;i++)
#define D(i,e,s) for(int i=e;i>=s;i--)
using namespace std;
int n,a[110][110];
int ans=0,father[510];
struct edge
{
    int x,y;
    int w;
}e[110];
int len=0;

void push(int xx,int yy,int ww)
{
    e[len++].x=xx;e[len].y=yy;e[len].w=ww;
}

int getfather(int k)
{
    int q=k;
    while(q!=father[q])
    q=father[q];
    while(q!=k)
    {
        int temp=father[k];
        father[k]=q;
        k=temp;
    }
    return q;
}

void init()
{
    scanf("%d",&n);
    F(i,1,n)
        F(j,1,n)
            scanf("%d",&a[i][j]);
    F(i,1,n)
        F(j,i,n)
        {
            int temp=min(a[i][j],a[j][i]);
            push(i,j,temp);
            push(j,i,temp);
        }
}
bool cmp(edge o,edge p){    return(o.w<p.w);}
void merge(int xx,int yy)
{
    int fx=getfather(xx);
    int fy=getfather(yy);
    father[fx]=fy;
}
void Kruskal()
{
    F(i,1,n)
    father[i]=i;
    sort(e+1,e+1+len,cmp);
    int got=0;
    F(i,1,len)
    {
        int u=getfather(e[i].x);
        int v=getfather(e[i].y);
        if(u!=v)
        {
            merge(u,v);
            ans+=e[i].w;
            if(++got==len-1)
                return;
        }
    }
}

int main()
{
    init();
    Kruskal();
    printf("%lld\n",ans);
    return 0;
}