これは2つの類似の問題の最初の問題であることに注意してください。あなたは両方の問題を解決する場合にのみ、この問題をハックすることができます。
あなたが木を与えられている n個のnノード。初めに、 0 0は、すべてのエッジの上に書かれています。一回の操作で、あなたはどんな選択することができます 2枚の、2つの異なる 葉 のu U、 Vの Vおよび任意の 実数 のx、xと追加 のxの間の単純なパス上のすべてのエッジの上に書かれた値にX のu uと V Vを。
追加:例えば、画面上に次のグラフに2つの操作を適用した結果を参照することができるの下に 2からの経路上に2 7 7へ 6付加し6、および - 0.5からパスに-0.5を 4 4へ 5 5です。
それはエッジに書かれた実数の任意の構成のために、私たちは操作の有限数でそれを達成できることは本当ですか?
リーフは、程度の木のノードである 1 1.簡単なパスは二回、任意のノードを含まないパスです。
入力
最初の行は、単一の整数含有 N、N(2 ≤ N ≤ 10 5ノードの数- 2≤n≤105)。
次の各 N - 1のn-1行は2つの整数を含んでいる U Uと Vの V(1 ≤ U 、V ≤のn個の 1≤u、v≤n、 Uは≠ Vの間にエッジが存在することを意味し、UはV≠します)ノード のu uと V V。これらのエッジはツリーを形成することが保証されています。
出力
私たちは、出力「の操作を実行することにより実現することができない木の端に書かれた実数の設定がある場合はNO」。
それ以外の場合は、出力" YES"。
あなたはどのような場合(上部または下部)の各文字を印刷することができます。
例
2 1 2
はい
3 1 2 2 3
NO
5 1 2 1 3 1 4 2 5
NO
6 1 2 1 3 1 4 2 5 2 6
はい
注意
最初の例では、我々は、任意の実際追加することができ 、Xのエッジのみに書き込まれた値Xを (1 、2 )(1,2)。
第2の例では、我々は到達できない構成のものである 0 0に書き込まれた (1 、2 )(1,2)と 1 1上に書かれた (2 、3 )(2,3)。
以下は、例からグラフを参照することができます 3 3、 4 4:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<vector> #include<cmath> #include<string> #include<map> #include<queue> using namespace std; #define INF 0x3f3f3f3f typedef long long ll; ll in[200001]; int main(){ ll n; while(cin>>n){ memset(in,0,sizeof(in)); for(ll i=1;i<=n-1;i++){ ll x,y; cin>>x>>y; in[x]++; in[y]++; } ll sign=0; for(ll i=1;i<=n;i++){ if(in[i]==2){ sign=1; break; } } if(sign==1){ cout<<"NO"<<endl; } else cout<<"YES"<<endl; } return 0; }