AGC017D Game on Tree(树型博弈)

题目大意:

给出一棵n个结点的树,以1为根,每次可以切掉除1外的任意一棵子树,最后不能切的话就为负,问是先手必胜还是后手必胜。

题解:

首先我们考虑利用SG函数解决这个问题

如果1结点有多个子节点,那么SG[1]显然就是子节点代表的子树的SG[x]异或和

所以我们就可以把子树全部拆开

问题就变成了多个树,每个树的根节点只有一个孩子

这种情况的SG[1]就等于它的孩子SG[x] + 1

证明如下

1、切掉孩子,那么SG[x] = 0,说明SG[1]大于0

2、切掉其他结点,局面变成[切掉结点的部分]加上[根节点连向孩子的一条边],也就是说当前局面的SG值必定大于[切掉结点的部分]的SG值,而SG值的定义又取最小,所以SG[1] = SG[x] + 1

然后dfs一遍就可以了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 1e5 +100;
vector<int> G[maxn];
int sg[maxn];
void dfs(int x, int fa){
    sg[x] = 0;
    for(auto to : G[x]){
        if(to == fa) continue;
        dfs(to, x);
        sg[x] ^= (sg[to]+1);
    }
}

int main()
{
    int n, x, y;
    cin>>n;
    for(int i = 1; i < n; i++){
        scanf("%d %d", &x, &y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
    dfs(1, 1);
    if(sg[1]) cout<<"Alice";
    else cout<<"Bob";
}
时间: 2024-10-11 05:06:40

AGC017D Game on Tree(树型博弈)的相关文章

POJ 2486 Apple Tree ( 树型DP )

#include <iostream> #include <cstring> #include <deque> using namespace std; #define SIZE 230 #define BACK 1 #define AWAY 0 int DP[SIZE][SIZE][2]; bool visits[SIZE]; int vals[SIZE]; deque< int > tree[SIZE]; int num, steps; void dfs

路径字符串数据转化为树型层级对象,path to json tree

由于项目中使用了react 及 ant-design ,在使用tree树型控件时,需要 类似下面的数据, const treeData = [{ title: '0-0', key: '0-0', children: [{ title: '0-0-0', key: '0-0-0', children: [ { title: '0-0-0-0', key: '0-0-0-0' }, { title: '0-0-0-1', key: '0-0-0-1' }, { title: '0-0-0-2',

【HDOJ 5834】Magic boy Bi Luo with his excited tree(树型DP)

[HDOJ 5834]Magic boy Bi Luo with his excited tree(树型DP) Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Bi Luo is a magic boy, he also has a migic tree,

【POJ 2486】 Apple Tree(树型dp)

[POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Accepted: 2990 Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There are N nodes in the tree. Each

php通用的树型类创建无限级树型菜单

生成树型结构所需要的2维数组,var $arr = array()数组格式如下: array( 1 => array('id'=>'1','parentID'=>0,'name'=>'一级栏目一'), 2 => array('id'=>'2','parentID'=>0,'name'=>'一级栏目二'), 3 => array('id'=>'3','parentID'=>1,'name'=>'二级栏目一'), 4 => arra

HDU_1561_The more, The Better_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7031    Accepted Submission(s): 4121 Problem Description ACboy很喜欢玩一种战略游戏,

HDU_1520_Anniversary party_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8233    Accepted Submission(s): 3574 Problem Description There is going to b

HDU_1011_Starship Troopers_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16276    Accepted Submission(s): 4335 Problem Description You, the leader o

一种理想的在关系数据库中存储树型结构数据的方法

一种理想的在关系数据库中存储树型结构数据的方法 在各种基于关系数据库的应用系统开发中,我们往往需要存储树型结构的数据,目前有很多流行的方法,如邻接列表模型(The Adjacency List Model),在此基础上也有很多人针对不同的需求做了相应的改进,但总是在某些方面存在的各种各样的缺陷.    那么理想中的树型结构应具备哪些特点呢?数据存储冗余小.直观性强:方便返回整个树型结构数据:可以很轻松的返回某一子树(方便分层加载):快整获以某节点的祖谱路径:插入.删除.移动节点效率高等等.带着这