CodeForces - 763A(互いに素セット/思考)

問題の意味

https://vjudge.net/problem/CodeForces-763A

無根ツリーの各ノードは色Cに感染している[I]

今、すべての色を満たすために、ルートノード点のすべての息子が(色違いに根ざしたさまざまなサブツリーの息子)の息子のルートノードと同じサブツリーあるのでこと、あなたがルートノードとしてポイントを選択してみましょう

思考

私のアプローチ:

水上暴力。エッジ点の同じ色の互いに素なセットもポイントを縮小し、[回答として各点を列挙し、同じ色のすべての点が取り付けられている点と、通信ブロックのサイズがN-1であると等しいと判断されます(自分でこの点を削除)することができます。

正解:

最初の異なる点の色点に接続された各点について計算し、異なる色の辺の数はまた、両端に記録されます。辺の点と異なる色のドットのも異なる色の特定の数と、すべての==数、この点は、条件を満たすことです。

確かに各通信のルートであっても、この時点で、通信のような他のブロックを考えるブロック、異なる色のみがこの点の根元側に発生させることができ、同じ色です。

コード

Iさん:

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
#define INF 0x3f3f3f3f 
の#define LL長い長
のconst int型N = 100005。
const int型MOD = 1E9 + 7。
constのダブルEPS = 1E-8; 
constのダブルPI = ACOS(-1.0); 
#define lowbit(X)(X&( - X))
INT C [N]、[N]事前; 
ベクター<INT> G [N]。
INTフラグ= 0。
int型の検索(INT X)
{ 
    IF(X ==事前[X])
        リターンX。
    戻りプレ[X] =見つける(予備[X])。
} 
集合<整数> S [N]。
int型のmain()
{ 
    のstd ::イオス:: sync_with_stdio(偽); 
    int型のn; 
    cinを>> N; 
    以下のために(INT iが= 1; I <N; I ++)
    { 
        int型、U、V。
        CIN >> U >> V; 
        G [U] .push_back(V)。
        G [V] .push_back(U)。
    } 
    INT Q、MX = 0。
    以下のために(; <I = N;整数iが1 = I ++)
    { 
        CIN >> C [i]は、
        事前[I] = I。
    } 
    ため(INT I 1 =; I <= N; I ++)
    { 
        int型SZ = G [I] .size()。
        用(INT J = 0; J <SZ、J ++)
        { 
            IF(C [I] == C [G [I] [J]])
            { 
                int型Fiが=見つける(I)、FJ =見つける(G [i]が[J])。
                (!Fiを= FJ)であれば
                    事前に[FJ] = Fiの。
            } 
        } 
    } 
    のために(INT I 1 =; I <= N; I ++)
    {
        Sは、[(I)検索](i)を挿入します。 
    {
    } 
    int型のP、F = 0。
    以下のために(INT I 1 =; I <= N; I ++)
    { 
        int型の和= 0。
        INT SZ = G [I] .size()。
        用(int型J = 0; J <SZ、J ++)
        { 
            int型、V = G [I] [J]。
            和+ = S [(V)を見つける]サイズ()。
        } 
     // coutの<< I <<」「<<合計<<てendl; 
        IF(S [i]の.size()= 1!)
        { 
            sum--。
        } 
        (和== N-1)であれば
        { 
            P = I。
            フラグ= 1。
            ブレーク; 
        } 
    } 
    (!フラグ)場合
        COUT << "NO" << ENDL。
    他の
        裁判所未満<< "YES" <<てendl; 
        coutの<< P <<てendl; 
    }
    0を返します。
} 
/ * 
7 
1 7 
1 3 
1 4 
4 5 
1 2 
2 6 
3 2 1 2 2 2 2 
* / 
/ * 
8 
1 4 
2 4 
3 4 
4 8 
1 7 
2 5 
2 6 
2 1 8 2 1 1 2 6 
* /

  

正解:

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
#define INF 0x3f3f3f3f 
の#define LL長い長
のconst int型N = 100005。
const int型MOD = 1E9 + 7。
constのダブルEPS = 1E-8; 
constのダブルPI = ACOS(-1.0); 
#define lowbit(X)(X&( - X))
INT C [N]、S [N]、U [N]、V [N]。
int型のmain()
{ 
    のstd ::イオス:: sync_with_stdio(偽); 
    int型のn; 
    cinを>> N; 
    以下のために(INT I 1 =; N iが<; I ++)
    { 
        CIN >> U [I] >> V [i]は、
    } 
    INT Q、MX = 0。
    以下のために(; <I = N;整数iが1 = I ++)
    { 
        CIN >> C [i]は、
    } 
    int型の和= 0。
    以下のために(INT I = 1、I <N; I ++) 
    {
        (!C [U [I] = C [V [I]])場合
            の[U [I]] ++、[V [i]は] ++、合計++よ。
    } 
    ため(INT I 1 =; I <= N; I ++)
    { 
        IF(S [I] ==合計)
        { 
            COUT << "YES" << ENDL << I << ENDL。
            0を返します。
        } 
    } 
    COUT << "NO" << ENDL。
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/mcq1999/p/12004627.html