您的位置:首页 > 其它

HDU_1301 Jungle Roads

2012-06-17 21:05 323 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1301

#include <cstdio>
#include <algorithm>
using namespace std;
struct edge
{
int u,v,w;
}node[900];
int parents[900];
void UFset()
{
for(int i=0;i<900;i++)
parents[i]=-1;
}
int Find(int x)
{
int s;
for(s=x;parents[s]>=0;s=parents[s]);
while(s!=x)
{
int tmp=parents[x];
parents[x]=s;
x=tmp;
}
return s;
}
void Union(int R1,int R2)
{
int r1=Find(R1),r2=Find(R2);
int tmp=parents[r1]+parents[r2];
if(parents[r1]>parents[r2])
{
parents[r1]=r2;
parents[r2]=tmp;
}
else
{
parents[r2]=r1;
parents[r1]=tmp;
}
}
int cmp(edge a,edge b)
{
return a.w<b.w;
}
int Kruskal(int n,int count)
{
int sum=0,num=0;//sum为权值num为选用边数
int u,v;
UFset();

for(int i=0;i<count;i++)
{
u=node[i].u;
v=node[i].v;
if(Find(u)!=Find(v))
{
Union(u,v);
sum+=node[i].w;
num++;
}
if(num>=n-1) break;
}

return sum;

}
int main()
{
int n,k,q,count;//k表示有几个连通点,q表示权值
char m,t;//m表示由谁开始,t表示由谁结束
while(scanf("%d",&n)!=EOF&&n)
{
count=0;
for(int i=0;i<n-1;i++)
{
getchar();
scanf("%c",&m);
scanf("%d",&k);
for(int j=0;j<k;j++)
{
getchar();
scanf("%c",&t);
scanf("%d",&q);
node[count].u=m-'A';
node[count].v=t-'A';
node[count].w=q;
count++;

}
}
sort(node,node+count,cmp);
printf("%d\n",Kruskal(n,count));
}
return 0;
}


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