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

本文介绍了一个使用朴素并查集解决最小生成树问题的例子。该问题涉及26个村落及连接它们的道路,目标是最小化连接所有村落的总成本。文章提供了完整的C语言实现代码。

    朴素的并查集应用,读题表示很不爽。。。题目讲有至多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 );
	}
}

转载于:https://www.cnblogs.com/Lyush/archive/2011/07/21/2112399.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值