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