hdu 1875 畅通工程再续

这是我第二次敲这个题,没想到果断悲剧了,最后只能翻出以前的代码,没想到是qsort出问题了,以后qsort全部用问号表达式,不再用a-b了.

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int set[105],t,c,m;
double sum = 0;
struct e
{
       int x,y;
       double v;
}val[10000];
struct coor
{
       int x,y;
}co[105];
int cmp( const void *a,const void *b )
{
    return ((e *)a) -> v > ((e *)b) -> v ? 1 : -1;//错在这里
}
int find( int x )
{
    return x == set[x] ? x : set[x] = find( set[x] );
}
void Kustra(  )
{
     for( int i = 0; i < m; ++i )
     {
          int x = val[i].x,y = val[i].y;
          if( find(x) != find( y ) )
          {
              set[find(x)] = find(y);
              sum += val[i].v;
          }
      }
 }
int main( )
{
    scanf( "%d",&t );
    while( t-- )
    {
           scanf( "%d",&c );
           m = 0;
           sum = 0;
           for( int i = 0; i < 105; ++i )
                set[i] = i;
           for( int i = 1; i <= c; ++i )
                scanf( "%d%d",&co[i].x,&co[i].y );
           for( int i = 1; i <= c; ++i )//找任意两点之间的距离
           {
                for( int j = 1; j < i; ++j )
                {
                     int x1 = co[i].x,x2 = co[j].x,y1 = co[i].y,y2= co[j].y;
                     double d = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
                     if( d >= 10 && d <= 1000 )
                     {
                         val[m].x = i;
                         val[m].y = j;
                         val[m].v = d;
                         ++m;
                     }
                 }
            }
             qsort( val,m,sizeof( val[1] ),cmp );
             Kustra( );
             int f = 0;
             for( int i = 1; i <= c; ++i )
                  if( set[i] == i )
                      ++f;
             if( f != 1 )
                 puts( "oh!" );
             else
                 printf( "%.1lf\n",sum*100 );
    }
    return 0;
}

转载于:https://www.cnblogs.com/Lvsi/archive/2011/02/27/1966442.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值