题目链接

\(Description\)

给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点。

两人轮流从树上删边,删去一条边后,不与根相连的一部分会被移除。最后无法移动的人输。问谁能赢。

\(Solution\)

如果没有环,那就是典型的树上删边游戏

考虑环,没有共用边且与树只有一个交点,那这是一个从树上某点\(x\)连出最后又连回这个点的简单环。

删除环上一边后会形成两条链 -> Multi-SG

若环是一个奇环,那么删去一条边后剩下的两条链奇偶性相同,这个后继状态的异或和(SG值)一定不为1,所以环的SG值为1(后继SG值的mex)

若环是一个偶环,那么删去一条边后剩下的两条链奇偶性相反,这个后继状态的异或和(SG值)一定不为0,所以环的SG值为0(mex)

于是可以删去所有偶环,把奇环看做一条边,就成了树上删边游戏的模型了

**树上删边游戏结论:叶子节点的SG值为0;中间节点的SG值为其 所有子节点SG值+1 后的异或和 **

具体见这

注: 访问完节点后不要忘记出栈

有长度为2的环!

#include <cstdio>
#include <cctype>
#include <cstring>
#define gc() getchar()
const int N=105,M=505; int t,n,m,Enum,H[N],to[M<<1],nxt[M<<1],sg[N],top,sk[N],vis[N];
//vis=0:未访问过 vis=1:访问过且不是某个环上的点(不考虑树上点) vis=-1:访问过且是某个环上的点
//对于vis[x]=-1的(环) 不能统计答案!
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AddEdge(int u,int v){
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
void DFS(int x,int f)
{
sk[++top]=x, vis[x]=1, sg[x]=0;
bool flag=0;
for(int i=H[x]; i; i=nxt[i])
if(to[i]==f && !flag) flag=1;//第一次连向父节点
else{
if(vis[to[i]]==1){//仅靠vis和传参的cnt解决不了环。。还是要用栈
int cnt=1,now=x;
while(now!=to[i])
++cnt, vis[now]=-1, now=sk[--top];
if(cnt&1) sg[to[i]]^=1;//奇环
}
else if(!vis[to[i]])
{
DFS(to[i],x);
if(~vis[to[i]]) sg[x]^=(sg[to[i]]+1);//环上的不能更新
}
}
if(~vis[x]) --top;//非环上的 及时出栈
} int main()
{
while(~scanf("%d",&t))//number of sub-trees
{
int res=0;
while(t--)
{
memset(vis,0,sizeof vis),
memset(H,0,sizeof H), Enum=top=0;
n=read(),m=read();
for(int u,v,i=1; i<=m; ++i) u=read(),v=read(),AddEdge(u,v);
DFS(1,0), res^=sg[1];
}
puts(res?"Sally":"Harry");
}
return 0;
}/*
1 2 2 1 2 1 2
*/

POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)的更多相关文章

  1. poj 3710 Christmas Game(树上的删边游戏)

    Christmas Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1967   Accepted: 613 Des ...

  2. POJ 3710 无向图简单环树上删边

    结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...

  3. poj 3710 Christmas Game 博弈论

    思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ...

  4. POJ Christmas Game [树上删边游戏 Multi-SG]

    传送门 题意: 有N 个局部联通的图.Harry 和Sally 轮流从图中删边,删去一条边后,不与根节点相连的部分将被移走.Sally 为先手.图是通过从基础树中加一些边得到的.所有形成的环保证不共用 ...

  5. 【HDU 3590】 PP and QQ (博弈-Anti-SG游戏,SJ定理,树上删边游戏)

    PP and QQ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删 ...

  7. poj 3710 Christmas Game【博弈论+SG】

    也就是转换到树形删边游戏,详见 https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html #include<iostream> ...

  8. POJ 3710 Christmas Game#经典图SG博弈

    http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏 ...

  9. POJ 3710 Christmas Game [博弈]

    题意:略. 思路:这是个删边的博弈游戏. 关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532 学习完预备知识后,这一 ...

随机推荐

  1. Dubbo——基于Zookeeper服务框架搭建及案例演示

    一.了解SOA微服务架构 在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡. (1) 当服务越来 ...

  2. 【windows核心编程】注入DLL时BUG排除与调试

    DLL注入排除bug的思路步骤. 1.在VS中监视输入err,hr检查DLL是否注入成功 2.OD断点loadlibraryW,loadlibraryA是否已经注入成功,eax是否有值. 3.检查路径 ...

  3. 【转】Linux中常见问题(磁盘 定时任务)

    [转]Linux中常见问题(磁盘 定时任务) 第1章 linux无法上网 1)     第一步,先ping域名. ping www.baidu.com 2)再ping一个公网ip , ping 223 ...

  4. 安装python3后使用pip和pip3的区别是什么?

    安装python3后使用pip和pip3的区别是什么? 1.其实这两个命令效果是一样的,没有区别: (1)比如安装库numpy,pip3  install  numpy或者pip  install   ...

  5. Python Tools for Machine Learning

    Python Tools for Machine Learning Python is one of the best programming languages out there, with an ...

  6. Linux下rsyslog日志收集服务环境部署记录【转】

    rsyslog 可以理解为多线程增强版的syslog. 在syslog的基础上扩展了很多其他功能,如数据库支持(MySQL.PostgreSQL.Oracle等).日志内容筛选.定义日志格式模板等.目 ...

  7. CentOS6.5优化脚本以及检测优化脚本

    一.tunning.sh #!/bin/bash # 系统优化脚本 # 使用于CentOS 6.4 x64系统 # Ver : 1.1.1 KCF=/etc/sysctl.conf # ------- ...

  8. 一个shell的面试题

    5.写一个脚本,实现判断192.168.1.024网络里,当前在线的D有哪些,能ping通则认为在线,在线输出"TP地址UP",不在线输出TP地址DOWN",无其他输出. ...

  9. Mac Terminal 菜鸟篇之目录跳转命令

    以前一直都是使用Windows系统,连命令行都没怎么用过.来到了Mac,在某位大神的诱导下,我开始尝试使用Mac Terminal,下面总结的是一些简单的目录跳转命令(菜鸟级). 文件目录 首先要清楚 ...

  10. S5PV210的根文件系统制作

    一.移植BusyBox1.下载BusyBox的源代码下载地址:http://www.busybox.net/downloads/,此处下载busybox-1.20.2.tar.bz2.2.解压并进入目 ...