• HDU1301 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 );
    	}
    }
    
  • 相关阅读:
    信息收集-DNS
    Xshell下载
    JSP
    本地网络配置
    P1485 火枪打怪
    P4155 [SCOI2015]国旗计划
    P1017 [NOIP2000 提高组] 进制转换
    P1013 [NOIP1998 提高组] 进制位
    P1011 [NOIP1998 提高组] 车站
    CF841B Godsend
  • 原文地址:https://www.cnblogs.com/Lyush/p/2112399.html
Copyright © 2020-2023  润新知