HDU 1875プロジェクト(Kruscalの最小スパニングツリー)を促進するために延期

  記事の著者:ktyanny 出典:ktyannyは  、指定したあなたに感謝してください再現。  

   ktyanny:まあ、中国のタイトルは、そのタイトルは多くを言わないについて説明します。最小スパニングツリーを解決するために考えられている表情で。対象は、それがフロート、WA、およびACに倍増するタイプと、少し恥ずかしいと関係し始めて残念です1Yませんでした......

 

   312MS C ++

/ *
ktyannyによる
2009年12月15日
* /
書式#include 
< stdio.hに >
する#include 
< STDLIB.H >
書式#include 
< 文字列 の.h >
の#include 
< のmath.h >
の#include 
< iostreamの > 使用して名前空間 はstd; CONSTのINT  MAX  = 105 typedef  構造体{ int型 X、Y。ダブル ワット; }エッジ; const int型 MAXN  = 50005 ;
 

   



    

    


   
エッジE [MAXN];
ダブル  ANS;

INT  ランク[MAXN];
int型  PA [MAXN];

ボイド  make_set( INT  X)
{
    PA [X] 
=の  X;
    ランク[X] 
= 0 ; } int型 find_set(INT  X){ IF (X  =! PA [X])        PA [X]  =  find_set(PA [X]); 戻り PA [X]; } / * プレスランク合わせXセット、Yをここで、* / ボイド union_set(int型 のx、  int型 Y、  ダブル W){  




    


    






    X 
=  find_set(X)、
    Y 
=  find_set(Y)、
    
IF (X  ==  Y) のリターン  ;
    ANS 
+ =  W;
    
IF (ランク[X]  >  ランク[Y]) / * 親ノードとして、より高いランクを作りますポイント * /
    {
        PA [Y] 
=  X;
    }
    
    {         PA [X]  =  Y; IF (ランク[X]  ==  ランク[Y])            ランク[Y] ++ ;     } } int型 CMP(CONST ボイド* A 、   


        






    CONST ボイド* B){ リターン ((* (エッジ  * )A).W  >  (* (エッジ  * )B).W) 1  :  - 1 } のtypedef  構造体{ ダブル XX、YY。}ポイント; 点P [ 105 ]。INT  のmain(){ int型 N、I、J、JJ、K、X、Y、T、M。文字 CH1、CH2;     cinを  >>  メートル。    一方、(M -     {         CIN     

    
 




    






    

    


    


>>  N;
        J 
= 0 ; 以下のための(I  = 1 ; iが  <=  N; iは++             CIN  >>  P [i]は.xx  >>  P [i]は.yy。/ * 处理图的边集* / ダブル 温度; 以下のための(I  = 1 ; iが  <=  N; iは++         { ため(K  =  I; K  <=  N; kは++             {                 TEMP  =  SQRT((P [i]は.xx - P [k]は.xx )  
        
 


        

        

        
 

            


* (P [i]は.xx - P [k]は.xx)  +  (P [i]は.yy - P [k]は.yy) * (P [i]は.yy - P [k]は.yy))。
                
もし (温度  < 10 ||  TEMP  > 1000年続けます                {                     E [J] .W  =  TEMP。                    E [J] .X  =  I;                     E [J] .Y  =  K。                    J ++ ;                 }             }         } のための(I  = 0      
                    

                










        
  ; <=  N。私は ++
            make_set(i)を、

        qsort(E、J、 
はsizeof (E [ 0 ])、CMP)。

        
/ * Kruscal过程求最小生成树 * /
        ANS 
= 0.0 以下のための(I  = 0 ; iが  <  jは、iが++         {             X  =  find_set(E [I] .X)。            Y  =  find_set(E [I] .Y)。もし(X  !=  Y)                union_set(X、Y、E [I] .W)。        } 場合(ANS  > 0  
        
 



            



        
  ){
            ANS 
* = 100             printf(" %.1lfする\ n " 、ANS)。        }  のprintf(" ああ、\ nは!" );     } 戻り0 }  


        


    
 

 

 

ます。https://www.cnblogs.com/ktyanny/archive/2009/12/15/1625049.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33895016/article/details/93965841