您的位置:首页 > 其它

Jungle Roads

2013-10-15 21:48 302 查看
poj1251:http://poj.org/problem?id=1251

题意:求n个村庄之间的最小生成树。
题解:建好图,然后之间kruska直接解题。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,num,k,cnt,sum,tt,next1;
char s1,s2;
int pa[28];
struct Node{
int u;
int v;
int w;
bool operator<(const Node &a)const{
return w<a.w;
}
}edge[1000];
void UFset(){//初始化
for(int i=1;i<=n;i++)
pa[i]=-1;
}
int Find(int x){//查找
int s;
for(s=x;pa[s]>=0;s=pa[s]);
while(s!=x){
int temp=pa[x];
pa[x]=s;
x=temp;
}
return s;
}
void Union(int R1,int R2){//合并
int r1=Find(R1);
int r2=Find(R2);
int temp=pa[r1]+pa[r2];
if(pa[r1]>pa[r2]){
pa[r1]=r2;
pa[r2]=temp;
}
else{
pa[r2]=r1;
pa[r1]=temp;
}
}
void kruska(){//求最小生成树
UFset();
num=0;sum=0;
for(int i=1;i<cnt;i++){
int u=edge[i].u;
int v=edge[i].v;
if(Find(u)!=Find(v)){
num++;
sum+=edge[i].w;
Union(u,v);
}
if(num>=n-1)break;
}
printf("%d\n",sum);
}
int main(){
while(~scanf("%d",&n)&&n){
cnt=1;
for(int i=1;i<n;i++){
//scanf("%c%d",s1,&tt);//注意 %c会把空格也会读进去
cin>>s1>>tt;
for(int j=1;j<=tt;j++){//建图
//scanf("%c %d",s2,&next1);
cin>>s2>>next1;
edge[cnt].u=s1-'A'+1;
edge[cnt].v=s2-'A'+1;
edge[cnt++].w=next1;
}
}
sort(edge+1,edge+cnt);//排序
kruska();

}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: