HDU-1301 Jungle Roads 并查集/最小生成数

    朴素的并查集应用,读题表示很不爽。。。题目讲有至多26个村落,每个村落有多条到其他村落的路,求出连通这些村落的最小代价。

代码如下:

#include <stdio.h>
#include <stdlib.h>

struct E
{
	int x, y, dis;
} e[10000];

int set[30];

int find( int x )
{
	return set[x]= x== set[x]? x: find( set[x] );
}

void merge( int a, int b )
{
	int x= find( a ), y= find( b );
	set[x]= y;
}

int cmp( const void *a, const void *b )
{
	struct E *x= ( struct E * )a, *y= ( struct E * )b;
	return x-> dis- y-> dis;
}

int main(  )
{
	int N;
	while( scanf( "%d", &N ), N )
	{
		for( int i= 0; i< 30; ++i )
		{
			set[i]= i;
		}
		char p[2];
		int num, dis, cnt= 0, ans= 0;
		for( int i= 1; i< N; ++i )
		{
			scanf( "%s %d", p, &num );
			int x= p[0]- 'A', y;
			for( int j= 0; j< num; ++j )
			{
				scanf( "%s %d", p, &dis );
				y= p[0]- 'A';
				e[cnt]. x= x, e[cnt]. y= y, e[cnt++]. dis= dis;
			}
		}
		qsort( e, cnt, sizeof( e[0] ), cmp );
		for( int i= 0; i< cnt; ++i )
		{
			int x= e[i]. x, y= e[i]. y, dis= e[i]. dis;
			if( find( x )!= find( y ) )
			{
				merge( x, y );
				ans+= dis;
			}
		}
		printf( "%d\n", ans );
	}
}
posted @ 2011-07-21 09:52  沐阳  阅读(273)  评论(0编辑  收藏  举报