题目链接https://codeforces.com/gym/102392/problem/F

题意:被这题题意坑了很久,大意是说有一棵根为 \(1\) 的树,每个节点初始都是白色, \(Alice\) 能在这棵树的某个节点放下一个棋子,并使得该节点变为黑色,然后从 \(Bob\) 开始,两人能轮流移动这个棋子到当前所在节点的任意一个白色的祖先或者后代节点(不需要相邻的节点),并且将移动到的节点染为黑色。谁先不能移动就输了。

分析:看到这道题,大致就是一个树上的博弈问题。我们一开始读错题意,以为必须得是移动到与当前节点相邻的节点,那这道题就很容易转化为求树上最大匹配的问题。我们发现如果这棵树的最大匹配是完美匹配,那么后手必胜,反之先手必胜,原因是:不论先手选哪一个节点,后手都能将棋子移动到与当前节点匹配的某一节点。但如果不存在完美匹配,那先手必然能避免这种情况。然后敲了个树上最大匹配交了上去就wa32了。。。

最后才发现不需要移动到相邻节点,事实上解决方法也类似上面说的树上最大匹配,只不过这个最大匹配并不需要相邻节点,只要某两个点满足互为祖先节点和后代节点就能匹配,这个问题可以通过树形 \(dp\) 解决。

我们记 \(dp_v\) 为 \(v\) 节点以及该节点对应子树未匹配节点的最小数量, \(cnt\) 为 \(\sum{dp_k}\) (v节点所有后代节点dp值之和),那么就容易得到:$$\begin{cases}

dp_v = cnt - 1 (cnt > 0), \ dp_v = 1 (cnt = 0). \

\end{cases}

\[如果 $dp[1]$ 的值为$0$ ,说明存在完美匹配。

**AC代码**:
```
#include <bits/stdc++.h>
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
int n, x, y, dp[SIZE];
bool vis[SIZE];
vector<int> G[SIZE];

void dfs(int fa, int now) {
bool f = false;
dp[now] = -1;
for (auto i : G[now]) {
if (i == fa) continue;
dfs(now, i);
if (vis[i]) f = true;
dp[now] += max(dp[i], (vis[i] ? 1 : 0));
}
if (!f || dp[now] > 0) vis[now] = true;
}

int main() {
io(); cin >> n;
rep(i, 1, (n - 1)) {
cin >> x >> y;
G[x].emplace_back(y);
G[y].emplace_back(x);
}
dfs(0, 1);
if (dp[1]) puts("Alice");
else puts("Bob");
}
```\]

Codeforces Gym 102392F Game on a Tree (SEERC2019 F题) 题解的更多相关文章

  1. Codeforces Round #519 by Botan Investments(前五题题解)

    开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...

  2. Codeforces Gym 100269K Kids in a Friendly Class 构造题

    Kids in a Friendly Class 题目连接: http://codeforces.com/gym/100269/attachments Description Kevin resemb ...

  3. Codeforces Gym 100650C The Game of Efil 模拟+阅读题

    原题链接:http://codeforces.com/gym/100650/attachments/download/3269/20052006-acmicpc-east-central-north- ...

  4. codeforces gym 100952 A B C D E F G H I J

    gym 100952 A #include <iostream> #include<cstdio> #include<cmath> #include<cstr ...

  5. Codeforces Round #268 (Div. 1) 468D Tree(杜教题+树的重心+线段树+set)

    题目大意 给出一棵树,边上有权值,要求给出一个1到n的排列p,使得sigma d(i, pi)最大,且p的字典序尽量小. d(u, v)为树上两点u和v的距离 题解:一开始没看出来p需要每个数都不同, ...

  6. Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)

    题目链接  2016 ACM-ICPC EC-Final Problem G 题意  给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...

  7. Codeforces Gym 100342J Problem J. Triatrip 三元环

    题目链接: http://codeforces.com/gym/100342 题意: 求三元环的个数 题解: 用bitset分别统计每个点的出度的边和入度的边. 枚举每一条边(a,b),计算以b为出度 ...

  8. Codeforces Gym 101252D&&floyd判圈算法学习笔记

    一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...

  9. Codeforces Gym 101190M Mole Tunnels - 费用流

    题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...

随机推荐

  1. vue学习指南:第十二篇(详细) - Vue的 路由 第二篇 ( 路由按需加载(懒加载))

    各位朋友 因 最近工作繁忙,小编停更了一段时间,快过年了,小编祝愿 大家 事业有成 学业有成 快乐健康 2020开心过好每一天.从今天开始 我会抽时间把 Vue 的知识点补充完整,以及后期会带给大家更 ...

  2. HDU 1542 Atlantis(扫描线算法)

    题意:给出n个矩形的左下角左边和右上角坐标,求这n个矩形的面积并 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 典型的扫描线算法的题目 什么是 ...

  3. 虚拟机中CentOS 6.5 添加扩展分区

    此扩展方法要求支持LVM 1.更改虚拟机配置 虚拟机->设置->硬盘->扩展磁盘容量 fdisk -l 查看,发现硬盘空间变大了 [root@thj Desktop]# fdisk ...

  4. EF CodeFirst简介、默认约定、数据库初始化策略

    CodeFirst 工作流程 创建或修改领域类-->使用数据注解或者Fluent API来配置领域类-->使用自动数据库迁移技术或者基于代码的数据库迁移技术来创建数据库. CodeFirs ...

  5. java.awt.Font

    显示效果 Font mf = new Font(String 字体,int 风格,int 字号);字体:TimesRoman, Courier, Arial等风格:三个常量 lFont.PLAIN, ...

  6. java List 排序,升序,降序

    import java.util.*; public class EntrySets { public static void main(String[] args) { Map<Object, ...

  7. Codeforces Round #570 (Div. 3) B. Equalize Prices

    原文链接https://codeforces.com/contest/1183/problem/B 题意:进行Q组测试,在每组中有长度为n的数组a[i],然后现在给你一个K,问你找到一个bi使得|ai ...

  8. 第四十七篇 入门机器学习——分类的准确性(Accuracy)

    No.1. 通常情况下,直接将训练得到的模型应用于真实环境中,可能会存在很多问题 No.2. 比较好的解决方法是,将原始数据中的大部分用于训练数据,而留出少部分数据用于测试,即,将数据集切分成训练数据 ...

  9. WLC5520分布式端口(数据口)使用1G模块!

    思科WLC5520有两个分布式端口.  在 10G 模式和 1G 模式之间切换•如果在端口 1 上未安装任何内容,则默认情况下主板配置为 10G 模式.因此,要切换到 1G 模式,则必须在端口 1上安 ...

  10. HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP

    Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...