問題の意味
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を返します。 }