zoj 1406 jungle roads

题意就是要求最小生成树,用的kruskal

#include <stdio.h>
#include <algorithm>
int p[30],n,x1;

struct edge
{
	int u,v,w;
}ed[100];

int get(int x)
{
	if(p[x]==x)
		return x;
	else
		return p[x]=get(p[x]);
}

void uni(int x,int y)
{
	int p1,p2;
	p1=get(x);
	p2=get(y);
	if(p1!=p2)
		p[p1]=p2;
}

int cmp(const void *a,const void *b)
{
	edge aa=*(const edge *)a;
	edge bb=*(const edge *)b;
	return aa.w-bb.w;
}

int kruskal()
{
	int cost=0;
	int x,y,i;
	for(i=0;i<x1;i++)
	{
		x=ed[i].u;
		y=ed[i].v;
		if(get(x)!=get(y))
		{
			cost+=ed[i].w;
			uni(x,y);
		}
	}
	return cost;
}

int main()
{
	int i,j,k;
	int w1;
	char u1,v1;
	while(1)
	{
		scanf("%d",&n);
		if(n==0)
			break;
		x1=0;
		getchar();
		for(i=0;i<n;i++)
			p[i]=i;
		for(i=1;i<=n-1;i++)
		{
			scanf("%c%d",&u1,&k);
			getchar();
			for(j=0;j<k;j++)
			{
				scanf("%c%d",&v1,&w1);
				ed[x1].u=u1-'A';
				ed[x1].v=v1-'A';
				ed[x1].w=w1;
				x1++;
				getchar();
			}
		}
		qsort(ed,x1,sizeof(ed[0]),cmp);
		printf("%d\n",kruskal());
	}
	return 0;
}


 

posted @ 2013-08-09 10:13  贝尔摩德  阅读(203)  评论(0编辑  收藏  举报