poj 1259 Agri-Net

来源:互联网 发布:淘宝中国制造店铺意义 编辑:程序博客网 时间:2024/05/22 10:42

kruskal 基础题

 

#include<stdio.h>#include<stdlib.h>#include <cmath>#include <iostream>#include <cstdlib>using namespace std;int parent[5000];int f[101][101];int k;struct edge{ int u,v,w;} edges[5000];int compare(const void *a, const void *b){return (*(edge *)a).w - (*(edge *)b).w;}int findset(int x){ int tmp,s; s=x; while (parent[s]>=0) s=parent[s]; while (s!=x) {   tmp=parent[x];   parent[x]=s;   x=tmp; } return s;}void unionset(int r1,int r2){   int rr1,rr2;   rr1=findset(r1);   rr2=findset(r2);   int tmp=parent[rr1]+parent[rr2];   if (rr1==rr2) return;   if (parent[rr1]>parent[rr2]) { parent[rr1]=rr2;                  parent[rr2]=tmp;                 }             else {                    parent[rr2]=rr1;                    parent[rr1]=tmp;                  }}int main(){ int a,b,n,m; edge s[10001]; while (scanf("%d",&n)==1) { for (int i=0;i<=n;i++) parent[i]=-1; m=0; for (int i=0;i<n;i++)  for (int k=0;k<n;k++)  {     scanf("%d",&f[i][k]);     if ( i<k ) { edges[m].u=i;edges[m].v=k;edges[m].w=f[i][k]; m++;                       }  } qsort(edges,m,sizeof(edges[0]),compare); int  num=0; int ans=0; for (int i=0;i<m;i++) {if (findset(edges[i].u)!=findset(edges[i].v))                                   {                                     num++;                                     ans=ans+edges[i].w;                                     unionset(edges[i].u,edges[i].v);                                   }if (num>=n-1) break;   }    printf("%d\n",ans);  }}


 

原创粉丝点击