用Kruskal算法解POJ 1251 Jungle Roads代码

来源:互联网 发布:ubuntu 禁用访客 编辑:程序博客网 时间:2024/06/07 22:37
 
#include<stdio.h>#include<algorithm>using namespace std;struct road{ int x,y,price;   //price表示连接 x,y村庄的公路维修费用 };int cmp(road a,road b){ return a.price<b.price;}int deal(int n){ int i,j,k=0,q,p,root[27],js=1,total=0;    //k--总边数  q--每一行边数  p--费用  root[]表示根 total--最少费用  road s[80]; char a,b;    //a--x, b--y    for(i=0;i<n-1;i++){        scanf("\n%c %d ",&a,&q);  for(j=0;j<q;j++){   scanf("%c %d ",&b,&p);   s[k].x=a-'A', s[k].y=b-'A', s[k++].price=p;   //root[b-'A']=a-'A';  } } sort(s,s+k,cmp);   //将边数按从小到大排序  for(i=0;i<n;i++)   //采用Kruskal算法  每个点指向自己      root[i]=i;   /*for(i=0;i<k;i++)      //输出查看     printf("%d--%d  %d ",s[i].x,s[i].y,s[i].price); printf("\n"); for(i=0;i<n;i++)    printf("%d->%d ",i,root[i]);    printf("\n--------------------------------\n");*/  int w; for(i=0;i<k&&js<n;i++)   if(root[s[i].x]!=root[s[i].y]){      total+=s[i].price;      root[root[s[i].y]]=root[s[i].x];   //合并两棵树       for(j=0;j<n;j++){     //更新祖先节点        w=j;       while(root[w]!=w)          w=root[w];       root[j]=w;      }       js++;    }   return total;}int main(){ int n,i,t=1,z[101];  //freopen("Jungle Roads.out","w",stdout);   //文件输出   scanf("%d",&n); while(n!=0){  z[t++]=deal(n);   //z[t]表示每次处理后的费用   scanf("%d",&n);   }   for(i=1;i<t;i++)    printf("%d\n",z[i]);     return 0;}

0 0
原创粉丝点击