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 ); } }