ギャラクシーWar--での接続は互いに素セットを逆転します

トピックリンク

質問の意味:

まず、所定の数をnとn、入力接続およびmと、m個の星の間の関係が与えられ、あなたの各星のP [I]のエネルギーの大きさを与える表します

クエリxが接続スターのX番号と番号xとyの太陽との間の接続の星最もエネルギー破壊破壊XYを表す場合、固定線QのQクエリを与えること太陽場合表します

ソリューション:

伝統的なアプローチは、最初の入力点にある互いに素セットビルドの関係を追加して、2点のオフの遭遇の間の関係を破壊する、裁判官を頼むようになったが、このような関係は、それを接続することは非常に困難であることは明らかですディスコネクト

Zhengnanzefan

私たちは下を決定し始めると、それは破壊して、これら2点の間の関係を確立するために来るとき、聞いて、その問い合わせの前を破壊するために、最後の1から結果を記録できるように、我々は適切に判断することができ、接続された第一の星を破壊しませんインクルード

どのように接続されている星を破壊しないように?

すべての惑星の最初の接続関係は、最大保存し、星を破壊するマークアップは(破壊した後、参加していないとマークされていない)何をすることができます

 

星の数がゼロベースの入力であることに注意してくださいだけでなく、Uは(順番に)、すなわちV <ことを確実にする数U、Vを確保するためにそうでなければ表示されることがあり、縁取り境界消去時間は1であり、2が、場合である2 1ケース

 

コード:

#include <iostreamの> 
する#include <stdio.hに> 
する#include <math.h>の
書式#include <CStringの> 
する#include <地図>
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 MAXN = 1E4 + 5 const  int型のハッシュ= 1000年INTのN、M。
INT P [MAXN]、[MAXN] F、[MAXN] ANS。
int型POS [MAXN]、[MAXN] MAXX。
構造体ノード
{ 
    int型X、Y。
} [MAXN]。
構造体のエッジ
{ 
    int型のOP、X、Y。 
} E [MAXN]。
マップ < int型int型 > VIS;
チャーS [MAXN]。
int型の検索(INT X)
{ 
    リターン F [X] == X X:F [X] = 検索(F [X])。
} 
ボイドは、(参加int型のx、int型のY)
{ 
    int型 FXを= 探す(X)。
    int型 FY = (y)を見つけます。
    もし(!FX = FY)
    { 
        F [FX] = FY。
        もし(MAXX [FX]> MAXX [FY])
        { 
            MAXX [FY] = MAXX [FX]。
            POS [FY] = POS [FX]。
        } 
        そう であれば(MAXX [FX] == MAXX [FY] && POS [FX] < POS [FY])
        { 
            POS [FY] = POS [FX]。
        } 
    } 
} 
int型のmain()
{ 
    int型フラグ= 0 一方、(〜のscanf(" %d個"、&N))
    { 

        場合(フラグ)のprintf(" の\ n " );
        そうでなければフラグ= 1 

        以下のためにint型私= 0 ; iがN <; I ++
        { 
            scanf関数(" %のD "、&P [I])。
            MAXXは、[I] = Pを[I]。
            POS [I] = I。
            F [I] = I。
        } 

        のscanf(" %dの"、&M)。
        以下のためにint型 i = 0 ; iがm <I ++の
        { 
            scanf関数(" %d個の%のD "、および[I] .X、&[I] .Y)。
            もし([I] .X> [I] .Y)スワップ([I] .X、[I] .Y)。
        }
        int型Q; 
        scanf関数(" %のD "、&Q)。
        vis.clear(); 
        以下のためにint型 i = 0 ; iはQを<; iは++ 
        { 
            scanf関数(" %sの" 、単数または複数);
            もし(S [ 0 ] == ' Q ' 
            { 
                E [i]が.OP = 0 
                scanf関数(" %のD "、&E [I] .X)。
            } 
            
            { 
                E [I] .OP =1 ; 
                scanf関数(" %d個の%のD "、&​​E [I] .X、&E [I] .Y)。
                もし(E [I] .X> E [I] .Y)スワップ(E [I] .X、E [I] .Y)。
                VIS [E [I] .X *ハッシュ+ E [I] .Y] = 1 
            } 
        } 
        のためのint型 I = 0 ;私がm <I ++は
        { 
            場合(VIS [[I]・X *ハッシュ+![I] .Y])[I]、[I]・X(参加.Y); 
        } 
        int型の CNT = 0 

        以下のためにint型 I = Q- 1 ; I> = 0 ; i--
        {
            もし(E [I] .OP == 0 
            { 
                int型、X = E [I] .X。
                int型の FX = (x)の検索;
                もし(MAXX [FX]> P [X])ANS [CNT ++] = POS [FX]。
                他の ANS [CNT ++] = - 1 ; 
            } 
            
            { 
                参加(E [I] .X、E [I] .Y)。
            } 
        } 
        のためにint型 I = CNT- 1 ; I> = 0 ; I - )のprintf(" %Dを\ n " 、ANS [I])。

    } 
    戻り 0 
}
コードの表示

  

 

おすすめ

転載: www.cnblogs.com/j666/p/11609892.html