首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责
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会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。