Agri-Net (kruscal)

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int parent[5000],n,ans;
structnode
{
    int from,to,weight;
}grid[5000];
bool com_greater(node vex1 ,node vex2)
{
    return vex1.weight<vex2.weight;
}
int FindR(int v)
{
    int t=v;
    while (parent[t]>-1)
        t=parent[t];
    return t;
}
void kruscal(int k)
{
    ans=0;
    int i,vex1,vex2,num;
    for (i=1;i<=k;i++)
        parent[i]=-1;
    for (num=1,i=1;i<=k;i++)
    {
        vex1=FindR(grid[i].from);
        vex2=FindR(grid[i].to);
        if(vex1!=vex2)
        {
            ans+=grid[i].weight;
            parent[vex2]=vex1;
            if(num++==n)
                return ;
        }
    }
}
int main()
{
    int i,j,k,a;
    while (scanf("%d",&n)!=EOF)
    {
        k=1;
        memset(grid,0,sizeof(grid));
        for (i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                scanf("%d",&a);
                if(j>i)
                {
                    grid[k].from=i;
                    grid[k].to=j;
                    grid[k++].weight=a;
                }
            }
        sort(grid+1,grid+k,com_greater);
        kruscal(k-1);
        printf("%d\n",ans);
    }
	return 0;
}
posted @ 2013-12-22 17:42  单调的幸福  阅读(136)  评论(0编辑  收藏  举报