1713:スパニングツリー

[タイトル]イタリア

 

N点を与えられ、mは、すべてのスパニングツリーの最小公倍数は、最大公約数の右端を図見つけ、無向グラフ縁。

 

[データサイズ]

データの20%のため、M = N-1;

データの他の20%のため、M = N;

データのさらに30%を、すべてのエッジの重みは、2のべき乗の整数であり、

データ100% 、N≤1000、M≤100000、di≤215-1、ans≤264-1 。

[説明]

検討最初のケースの右側には、2のべき乗の整数、我々は木の最小重量エッジ電力にまたがるランの最大数に正しい値の各エッジは答え2であることができています。

 

その後、我々は、それぞれの素因数のために最大の実行が最終的な答えを乗じて、スパニングツリーを素因数に追加の数の素因数のベクトルの各エッジ右側のための品質係数の同じアプローチ、分解を考慮することができます。

 

コードは以下の通りであります:

 

#include <ビット/ STDC ++ H>
 に#define INT長い長い
 使用して 名前空間STDを、
CONST  INT N = 1005、M = 100005 整数 N、M、ANS、ZHI [ 70005 ]、トップ、NE [ 70000 ]、FA [N]。
構造体PIGU 
{ 
    INT CO、DAO、泉。
} [M]。
ベクター <PIGU> VEの[ 70000 ]。
ブールブック[ 70000 ]; 
インラインINTは()読み取り
{ 
    チャー C = GETCHAR()。
    INT X = 0、F = 1;
    一方、 {(isdigit(C)!)であれば(C == ' - ')、F = - 1 ; C = GETCHAR();}
     ながら(isdigit(c)参照){X =(x << 3)+(X < < 1)+ C- ' 0 ' ; C = GETCHAR();}
     戻り X * F。
} 
インラインINT見つける(INT X)
{ 
    場合(FA [X] == x)をリターンX。
    FA [X] = 見つける(FA [X])。
    リターンFA [X]。
} 
インラインボイドYCL()
{
    以下のためにINT iが= 2 ; I <= 67000 ; I ++ 
    { 
        場合(ブック[I] == 0 
            ZHI [ ++トップ] = I、NE [I] = I。
        INT J = 1 ; J <=トップ&& ZHI [J] * I <= 67000 ; J ++ 
        { 
            ブック[ZHI [J] * I] = 1 
            NE [志[J] * I] = 志[J]。
            もし(I%志[J] == 0ブレーク
        } 
    } 
} 
インラインBOOLCMP(PIGU X、PIGUのY)
{ 
    リターン x.quan> y.quan。
} 
インラインINT zxscs(INT X)
{ 
    int型フアン= VEの[X] .size()。
    ソート(CMP)[X] .END(VEの、)[X] .begin(VE)。
    以下のためにINT iが= 1 ; I <= N; I ++)FA [I] = I。
    int型 CNT = 0 ;
    以下のためにINTは iは= 0 ; I <フアン; I ++ 
    { 
        int型 FA1 =(.CO [I] [X] VE)を見つける、FA2 = ([I] .dao [X] VE)を見つけます。
        もし(!FA1 = FA2) 
        {
            CNT  ++; 
            FA [FA1] = FA2。
        } 
        場合(CNT == N- 1リターンVEの[X] [I] .quan。
    } 
    戻り 0 
} 
)(主符号付き
{ 
    N =(読み取り); mは= 読み取ります(); 
    YCL(); 
    INTは iは= 1 ; I <= M; I ++ 
    { 
        [I] .CO = read()は、[I] .dao = read()は、[I] .quan = (読み取り)
        PIGU大湖 = A [i]は、
        INT HU = [I] .quan。
        しばらく(HU>1
        {     
            INT GU = 0、HA = NE [HU]。
            一方(NE [HU] == HA)
            { 
                GU ++ 
                HU / = NE [HU]。
            } 
            dahu.quan = GU。
            VEの[HA] .push_back(大湖)。
        } 
        dahu.quan = 1 
        VEの[ 1 ] .push_back(大湖)。
    } 
    であれば(zxscs(1)== 0 
    { 
        COUT << " 0 ";
        リターン 0 ; 
    } ANS = 1 以下のためにINT iが= 2 ; I <= 67000 ; I ++ 
    { 
        int型 HU = VEの[I] .size()。
        もし(HU> = N- 1 
        { 
            int型 GA = 1、HA = zxscs(I)。
            一方、(ha--)GA * = I。
            ANS * = GA; 
        } 
    } 
    COUT << ANS。
}
コードの表示

おすすめ

転載: www.cnblogs.com/betablewaloot/p/12207877.html
おすすめ