朴素的并查集应用,读题表示很不爽。。。题目讲有至多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 );
}
}
本文介绍了一个使用朴素并查集解决最小生成树问题的例子。该问题涉及26个村落及连接它们的道路,目标是最小化连接所有村落的总成本。文章提供了完整的C语言实现代码。
3754

被折叠的 条评论
为什么被折叠?



