POJ 1258

来源:互联网 发布:智能问答系统源码 编辑:程序博客网 时间:2024/05/16 05:55
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define maxx 105int k,p[maxx];int n;struct Edge{ int u,v,w;}edge[maxx*maxx/2];bool cmp(Edge a,Edge b){  return a.w<b.w;}int findpa(int x){  return p[x]==x?x:p[x]=findpa(p[x]);}int kruskal(){  for(int i=1;i<=n;i++)  p[i]=i;  sort(edge,edge+k,cmp);  int ans=0,num=0;  for(int i=0;i<k;i++)  {    int p1=findpa(edge[i].u);    int p2=findpa(edge[i].v);    if(p1!=p2){  num++;  ans+=edge[i].w;  p[p1]=p2;}if(num==n-1)return ans;  }  return ans;}int main(){int x;while(scanf("%d",&n)!=EOF){  k=0;  for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)  {    scanf("%d",&x);    if(i<j){  edge[k].u=i;  edge[k].v=j;  edge[k].w=x;  k++;}  }  int ans=kruskal();  printf("%d\n",ans);}return 0;}

0 0