POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)
\(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)的更多相关文章
- poj 3710 Christmas Game(树上的删边游戏)
Christmas Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1967 Accepted: 613 Des ...
- POJ 3710 无向图简单环树上删边
结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...
- poj 3710 Christmas Game 博弈论
思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ...
- POJ Christmas Game [树上删边游戏 Multi-SG]
传送门 题意: 有N 个局部联通的图.Harry 和Sally 轮流从图中删边,删去一条边后,不与根节点相连的部分将被移走.Sally 为先手.图是通过从基础树中加一些边得到的.所有形成的环保证不共用 ...
- 【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 ...
- codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删 ...
- poj 3710 Christmas Game【博弈论+SG】
也就是转换到树形删边游戏,详见 https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html #include<iostream> ...
- POJ 3710 Christmas Game#经典图SG博弈
http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏 ...
- POJ 3710 Christmas Game [博弈]
题意:略. 思路:这是个删边的博弈游戏. 关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532 学习完预备知识后,这一 ...
随机推荐
- python模块分析之logging日志(四)
前言 python的logging模块是用来设置日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块 ...
- 三 、 Multivariance Linear Regssion练习(转载)
转载:http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2962116.html 前言: 本文主要是来练习多变量线性回归问题(其实本文也就3个 ...
- mysql binglog server的设置方法【原创】
MySQL备份数据都是MySQL备份+binlog,这样才能保证数据的完整性.下面就是利用mysqlbinlog搭建mysql binlog server,可以把binlog传到远程存储上. 试验环境 ...
- nodejs 数据库操作,消息的发送和接收,模拟同步
var deasync = require('deasync'); //导入模板 var mysql=require('mysql'); var Stomp = require('stompjs'); ...
- openstack 安全策略权限控制等api接口
computer API: 创建安全组 /os-security-groups 创建安全组规则 /os-security-group-default-rules Netw ...
- Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
# yum install -y vim Loaded plugins: fastestmirror, presto Loading mirror speeds from cached hostfil ...
- Ex 6_26 序列对齐..._第七次作业
- python+selenium十二:一个输入框双层input标签
先点击第一个,再对第二个进行操作,否则操作失败 driver.find_element_by_css_selector(".pwd").click()driver.find_ele ...
- python接口自动化测试十五:解决密码动态,无法登录情况
解决问题:每次密码都是变化的,无法通过账号密码登录 (总不能每次去fiddler复制吧????) 解决思路: 1.先用selenium调用浏览器(不会selenium的自己想办法了), 2.登录后从浏 ...
- HTTP请求报文和响应报文
HTTP请求报文 GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User ...