贪心,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()
#每日一题挑战#
全部评论

相关推荐

2025-12-19 15:04
门头沟学院 Java
小肥罗:hr爱上你了,你负责吗哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务