この質問の考え方はより独創的で、XORの性質を調べます。
まず、最大のケースを分析します。このケースの分析は、どの2つのパスが同じでなければならないかを検討することです。その場合、1つのケースのみ、つまり、特定のノードの下に複数のリーフノードがあります。これにより、リーフノード間には2つのパスしかありません。 、したがって、これらの2つのパスの値は等しい必要があります。他の場合では、質問の意味を満たすためにランダムに配置できます。これは、任意の重みを選択できるため、構築でき、他のパスの値が異なる可能性があるためです。これはかなり複雑であることがわかりますが、それは明らかに正しいです。
さらに、私たちの分析は最小であり、ここではXORのプロパティを使用する必要があります。XORの性質によれば、すべてのリーフノード間のパスが偶数である場合、同じ値XORの偶数が1 0です
奇数のパスがあると、答えは3になります。つまり、3つの数値1 2 3を入力することで満たすことができます。最初に、2つの数値をすべて満たしてはなりません。次に、123 XORが0であることがわかり、自己解決できます。アレンジ。
多くの質問はより複雑であることがわかりますが、それでも考えるのは直感的です。そのため、多くの人が質問を非常に速く考えています
#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include < string > #include <map> #include <vector> using namespace std; typedef long long ll; const int N = 1e6 + 10 ; const int mod = 1e9 + 7 ; int e [N]、ne [N]、h [N]、idx; int in [N]; int p [N]; ボイドadd(int a、int b){ e [idx] = b、ne [idx] = h [a]、h [a] = idx ++ ; } void dfs(int u、int tmp、int fa){ p [u] = tmp; for(int i = h [u]; i!=- 1 ; i = ne [i]){ int j = e [i]; もし(J == FA) 続けます。 dfs(j、tmp ^ 1 、u); } } int main(){ int n; シン>> n; int i; memsetの(H、 - 1、はsizeof H)。 for(i = 1 ; i <n; i ++ ){ int a、b; scanf(" %d%d "、&a、&b); add(a、b); add(b、a); 中に [A] ++ ; [B] ++ ; } int mi = 1 ; int mx = n- 1 ; for(i = 1 ; i <= n; i ++ ){ if( in [i] == 1 ){ dfs(i、0、-1 ); 休憩; } } for(i = 1 ; i <= n; i ++ ){ if(in [i] == 1 && p [i] == 1 ){ mi = 3 ; 休憩; } } for(i = 1 ; i <= n; i ++ ){ int cnt = 0 ; for(int j = h [i]; j!=-1 ; j = ne [j]){ int k = e [j]; if(in [k] == 1 ){ cnt ++ ; } } if(cnt> = 2 ){ mx = mx-cnt + 1 ; } } cout << mi << " " << mx << endl; }