贪心,dfs
小红的树上删边
https://www.nowcoder.com/practice/675ca4c5402945148f99c46418c1b82a
思路:首先要想到一个特判,那就是当节点n的个数为奇数时,必然不满足条件中的全偶数划分。然后就是贪心进行划分,什么意思?打个比方来说,我在4的时候进行划分,不如在2的时候就进行划分,这样就可以多一次划分,更优
所以说,我们可以统计子树大小,一旦遇到偶数就进行划分,这可以用递归dfs来做。具体来说,当我们执行自底向上的归部分时,一旦遇到偶数就进行划分,但不用真的去把子树划分,也不需要改变size的大小,为什么?
因为偶数 + 偶数,依旧是偶数,我们自底向上的过程中,是size的不断累加,我们只需要在size为偶数的时候划分就可以了
注意:首先需要用python3 + 栈扩展提交,这是题目说的。其次res要初始化为-1,原因是自底向上的归部分,最终是在根节点,此时统计的n为偶数,就是整个树的大小,我们无法进行划分,最终结果要-1,那就可以在初始化这里设置成-1即可
代码:
import sys
sys.setrecursionlimit(200000)
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def GMI():
return map(lambda x: int(x) - 1, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n = II()
g = [[] for _ in range(n + 1)]
for _ in range(n - 1):
u, v = MII()
g[u].append(v)
g[v].append(u)
if n & 1:
print(-1)
return
size = [1] * (n + 1)
res = -1
def dfs(u, fa):
nonlocal res
for v in g[u]:
if v == fa:
continue
dfs(v, u)
size[u] += size[v]
if size[u] & 1 == 0:
res += 1
dfs(1, 0)
print(res)
t = 1
# t = II()
for _ in range(t):
solve()
#每日一题挑战#