symons

___________每一天都是幸福的!!

  博客园  ::  :: 新随笔  ::  :: 订阅 订阅  :: 管理

这题跟上一个题是一样的。就出所有最小生成树的所有边的值就可以了。

直接代码吧。

  1 #include <stdio.h>
  2 #include <algorithm>
  3 #include <iostream>
  4 #include <string.h>
  5 #define MAXN 10000
  6 #define MAXM 50000
  7 using namespace std;
  8 int point[500+10][500+10];
  9 struct edge
 10 {
 11     int u,v,w;
 12 } edges[MAXM];
 13 int parent[MAXN];
 14 int n,m;
 15 int i,j;
 16 int maxx;
 17 
 18 //并查集
 19 void UFset()
 20 {
 21 
 22     for(i=1; i<=n; i++)
 23         parent[i]=-1;
 24 }
 25 int Find(int x)
 26 {
 27     int s;
 28     for(s=x; parent[s]>=0; s=parent[s])  ;
 29     while(s!=x)
 30     {
 31         int tmp=parent[x];
 32         parent[x]=s;
 33         x=tmp;
 34     }
 35     return s;
 36 }
 37 void Union(int R1,int R2)
 38 {
 39     int r1=Find(R1),r2=Find(R2);
 40     int tmp=parent[r1]+parent[r2];
 41     if(parent[r1]>parent[r2])
 42     {
 43         parent[r1]=r2;
 44         parent[r2]=tmp;
 45     }
 46     else
 47     {
 48         parent[r2]=r1;
 49         parent[r1]=tmp;
 50     }
 51     return;
 52 }
 53 //并查集
 54 bool cmp(edge a,edge b)
 55 {
 56     return a.w<b.w;
 57 }
 58 void Kruskal()
 59 {
 60     maxx=0;
 61     int sumweight=0;
 62     int num=0;
 63     int u,v;
 64     UFset();
 65     for(i=0; i<m; ++i)
 66     {
 67         u=edges[i].u;
 68         v=edges[i].v;
 69         if(Find(u)!=Find(v))
 70         {
 71             if(edges[i].w>maxx) maxx=edges[i].w;
 72             sumweight+=edges[i].w;
 73             ++num;
 74             Union(u,v);
 75         }
 76     }
 77     printf("%d\n",sumweight);
 78 }
 79 
 80 int main()
 81 {
 82     int t,count;
 83     while(scanf("%d",&n)!=EOF)
 84     {
 85         memset(point,0,sizeof(point));
 86 
 87 
 88 
 89         for(i=0; i<n; ++i)
 90             for(j=0; j<n; ++j)
 91             {
 92                 scanf("%d",&point[i][j]);
 93                 if(point[i][j]==0) point[i][j]=1000000000;
 94             }
 95         m=0;
 96         for(i=0; i<n; ++i)
 97             for(j=0; j<=i; ++j)
 98             {
 99                 if(i==j) continue;
100                 edges[m].u=i+1;
101                 edges[m].v=j+1;
102                 edges[m].w=point[i][j];
103                 m++;
104             }
105         sort(edges,edges+m,cmp);
106         Kruskal();
107 
108     }
109     return 0;
110 }

 

posted on 2012-10-26 15:00  symons  阅读(128)  评论(0编辑  收藏  举报