• 最小生成树卡hdu1875畅通工程再续


    首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责

        http://acm.hdu.edu.cn/showproblem.php?pid=1875

        这是我做过最恶心的最小生成树的标题 ,本来看有一段时间没做这个l类型的标题了,拿个标题练练手,结果。。。一全部晚上就卡这个活该的标题上面,我就想不通为什么sort会wa,但是qsort却AC了

        每日一道理
    如果说友谊是一颗常青树,那么,浇灌它的必定是出自心田的清泉;如果说友谊是一朵开不败的鲜花,那么,照耀它的必定是从心中升起的太阳。 多少笑声都是友谊唤起的,多少眼泪都是友谊揩干的。友谊的港湾温情脉脉,友谊的清风灌满征帆。友谊不是感情的投资,它不需要股息和分红。(友谊可以换其他词语)
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<stdlib.h>
    using namespace std ;
    const int maxn = 105 ;
    struct node 
    {
    	int x , y ;
    	double value ;
    }edge[ maxn * ( maxn - 1 ) / 2 ] ;
    int n ;
    int fa[ maxn ] ;
    int temp[ maxn ][ 2 ] ;
    /*
    int cmp( node a , node b )
    {
    	return a.value > b.value ;
    }
    */
    int cmp( const void *a ,const void * b )
    {
    	return ( (*(node*)a).value - (*(node*)b).value ) > 0 ? 1 : -1 ;
    }
    int find( int x )
    {
    	return fa[ x ] = x == fa[ x ] ? x : find( fa[ x ] ) ;
    }
    int main()
    {
    	int Case ;
    	int i , j , k ;
    	scanf( "%d" , &Case ) ;
    	while( Case-- )
    	{
    		scanf( "%d" , &n ) ; 
    		for( i = 1 ; i <= n ; i++ )
    		{
    				scanf( "%d %d" , &temp[ i ][ 0 ] , &temp[ i ][ 1 ] ) ;
    				fa[ i ] = i ;
    		}
    		double temp1 ;
    		k = 0 ;
    		for( i = 1 ; i <= n ; i++ )
    		{
    			for( j = i + 1 ; j <= n ; j++ )
    			{
    				temp1 = sqrt( ( temp[ i ][ 0 ] - temp[ j ][ 0 ] ) * ( temp[ i ][ 0 ] - temp[ j ][ 0 ] ) + ( temp[ i ][ 1 ] - temp[ j ][ 1 ] ) * ( temp[ i ][ 1 ] - temp[ j ][ 1 ] ) ) ;
    				if( temp1 < 10 || temp1 > 1000 )
    					continue ;
    				else
    				{
    					edge[ k ].x = i ;
    					edge[ k ].y = j ;
    					edge[ k ].value = temp1 ;
    					k++ ;
    				}
    			}
    		}
    		//sort( edge , edge + k , cmp ) ;
    		qsort( edge , k , sizeof( edge[ 0 ] ) , cmp ) ;
    		int sum = 0; 
    		double ans = 0.0 ;
    		for( i = 0 ; i < k ; i++ )
    		{
    			int x1 = find( edge[ i ].x );
    			int x2 = find( edge[ i ].y );
    			if( x1 != x2 )
    			{
    				fa[ x1 ] = x2 ;
    				sum++ ;
    				ans += edge[ i ].value ;
    			}
    			if( sum == n - 1 )
    				break ;
    		}
    		if( sum == n - 1)
    		{
    			printf( "%.1lf\n" ,ans * 100 ) ;
    		}
    		else
    			printf( "oh!\n" ) ;
    	}
    	return 0 ;	
    }

    文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。

  • 相关阅读:
    【转】 cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    HDU How many prime numbers
    《大学ACM的总结 》(转载)
    POJ 最小公倍数
    HDU 开门人和关门人
    HDU shǎ崽 OrOrOrOrz
    HDU Saving HDU 2111
    HDU 1106 排序
    strtok函数()
    HDU 2187汶川地震
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3084630.html
Copyright © 2020-2023  润新知