poj1258(最小生成树Kruscal)

来源:互联网 发布:复杂网络 计算机 编辑:程序博客网 时间:2024/06/05 11:59
#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#define For(i,j,k) for(i=j;i<=k;i++)using namespace std;const int maxx=101;struct node{    int x,y,data;}a[maxx*maxx];int n,sum,m,fathe[maxx];int cmp(const node &a,const node &b){    if (a.data<b.data) return 1; else return 0;}int findfa(int x){    if (fathe[x]!=x) fathe[x]=findfa(fathe[x]);    return fathe[x];}void uni(int x,int y){    int fa=findfa(x);    int fb=findfa(y);    if (fa!=fb) fathe[fa]=fb;}int main(){    int i,j;    while (scanf("%d",&n)!=EOF) {        int ttt;        m=0;        For(i,1,n)            For(j,1,n) {cin>>ttt;if (i!=j) {a[++m].x=i;a[m].y=j;a[m].data=ttt;}}        sum=0;        sort(a+1,a+m,cmp);        int kkk=0;        For(i,1,n) fathe[i]=i;        For(i,1,m) {            if (findfa(a[i].x)!=findfa(a[i].y)) {                uni(a[i].x,a[i].y);                sum+=a[i].data;                kkk++;            }            if (kkk==n-1) break;        }        printf("%d\n",sum);    }    return 0;}

1 0