posts - 100,  comments - 15,  trackbacks - 0

//第一次用kruskal


  1#include<iostream>
  2#include<stdlib.h>
  3#define MAX 100
  4using namespace std;
  5
  6struct Edge
  7{
  8    int u;
  9    int v;
 10    int w;
 11}
;
 12
 13int parent[MAX];   //全局,感觉不太好
 14
 15int cmp(const void *a, const void *b)
 16{
 17    return (*(Edge*)a).w-(*(Edge*)b).w;
 18}

 19
 20int find(int vertex)
 21{
 22    if( parent[vertex]<0 ) 
 23        return vertex;
 24    else 
 25        return find(parent[vertex]);  
 26}

 27
 28void Union(int u,int v)
 29{
 30    int pu=find(u),        //parent of u 
 31        pv=find(v),        //parent of v
 32        tmp;
 33    if (pu != pv)
 34    {
 35        tmp = parent[pu] + parent[pv];        //加权合并
 36        if (parent[pu] > parent[pv])        //较小的树连接到较大的树后
 37        {
 38            parent[pu] = pv;
 39            parent[pv] = tmp;
 40        }
 
 41         else 
 42           {
 43            parent[pv] = pu;
 44            parent[pu] = tmp;
 45        }
 
 46    }
 
 47}

 48
 49int kruskal(Edge edge[],Edge mst[],int en,int vn)
 50{
 51    int i,j,k;
 52    j=0;k=0;
 53    for(i=0; i<en; i++)
 54    {
 55        if( find(edge[i].u) != find(edge[i].v) ) //不属于同一棵树
 56        {
 57            mst[j].u=edge[i].u;
 58            mst[j].v=edge[i].v;
 59            mst[j].w=edge[i].w;
 60            j++;
 61            k+=edge[i].w;
 62            Union(edge[i].u, edge[i].v);
 63        }

 64        if(j== vn-1break;
 65    }

 66    return k;
 67}

 68
 69int main()
 70{
 71    int vn,i,j,en=0,sum=0;
 72    int grap[MAX][MAX];
 73
 74    Edge edge[MAX * MAX];
 75    Edge mst [MAX];
 76
 77    while(scanf("%d",&vn)==1)
 78    {
 79        en=0;
 80        sum=0;
 81        memset(parent,-1,sizeof(parent));  //makeset
 82
 83        for(i=0;i<vn;i++)
 84            for(j=0;j<vn;j++)
 85                scanf("%d",&grap[i][j]);
 86
 87        for(i=0;i<vn;i++)
 88            for(j=0;j<vn;j++)
 89                if(i<j) { edge[en].u=i;edge[en].v=j; edge[en].w=grap[i][j]; en++; }
 90
 91        qsort(edge,en,sizeof(edge[0]),cmp);
 92
 93        kruskal(edge,mst,en,vn);
 94
 95        for(i=0;i<vn-1;i++)    
 96            sum+=mst[i].w;
 97        cout<<sum<<endl;
 98    }

 99
100    return 0;
101}

102
posted on 2009-04-03 01:42 wyiu 阅读(210) 评论(0)  编辑 收藏 引用 所属分类: POJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理