思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点。

之后用博弈论的知识:某点的SG值等于子节点+1后的异或和。

代码如下:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int ans;
vector<int>p[];
bool vis[],inss[];
int low[],dfa[],num[][],ss[],top;
void Tarjan(int u,int pre,int d)
{
low[u]=dfa[u]=d;
ss[top++]=u;
inss[u]=;
for(int i=;i<p[u].size();i++){
int v=p[u][i];
if(v==pre&&num[u][v]>){
if(num[u][v]%==) vis[u]=;
continue;
}
if(!dfa[v]){
Tarjan(v,u,d+);
low[u]=min(low[u],low[v]);
}
else if(v!=pre&&inss[v]){
low[u]=min(low[u],dfa[v]);
}
}
if(low[u]==dfa[u]){
top--;
int cnt=;
while(ss[top]!=u){
vis[ss[top--]]=;
cnt++;
}
if(cnt&) vis[ss[top+]]=;
}
}
int dfs(int d,int pre)
{
int ans=;
for(int i=;i<p[d].size();i++){
if(p[d][i]!=pre&&!vis[p[d][i]])
ans^=(+dfs(p[d][i],d));
}
return ans;
}
int main()
{
int n,m,a,b,t,ans;
while(scanf("%d",&t)!=EOF){
ans=;
while(t--){
memset(vis,,sizeof(vis));
memset(ss,,sizeof(ss));
memset(low,,sizeof(low));
memset(dfa,,sizeof(dfa));
memset(num,,sizeof(num));
memset(inss,,sizeof(inss));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) p[i].clear();
while(m--){
scanf("%d%d",&a,&b);
num[a][b]++;
num[b][a]++;
p[a].push_back(b);
p[b].push_back(a);
}
top=;
Tarjan(,-,);
ans^=dfs(,-);
}
puts(ans?"Sally":"Harry");
}
return ;
}

poj 3710 Christmas Game 博弈论的更多相关文章

  1. POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)

    题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...

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

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

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

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

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

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

  5. POJ 3710 Christmas Game

    知识储备: 解决办法(奇偶去环):   (1) 对于长度为奇数的环,去掉其中任意一个边之后,剩下的 两个链长度同奇偶,抑或之后的 SG 值不可能为奇数,所 以它的 SG 值为 1: (2) 对于长度为 ...

  6. POJ 3710 Christmas Game [博弈]

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

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

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

  8. Solution -「POJ 3710」Christmas Game

    \(\mathcal{Decription}\)   Link.   定义一棵圣诞树: 是仙人掌. 不存在两个同一环上的点,度数均 \(\ge 3\).   给出 \(n\) 棵互不相关的圣诞树,双人 ...

  9. POJ3710 Christmas Game 博弈论 sg函数 树的删边游戏

    http://poj.org/problem?id=3710 叶子节点的 SG 值为0:中间节点的SG值为它的所有子节点的SG值加1后的异或和. 偶环可以视作一个点,奇环视为一条边(连了两个点). 这 ...

随机推荐

  1. C#(HTML)_小技巧_关于textbox框中不能输入HTML标签的解决方法(如输入“<p>”后,在提交表单时系统会崩溃)

    主要修改文件是config文件(Web.config): 1.在<pages>标签中添加属性:validateRequest="false" <pages val ...

  2. hdu 2094 产生冠军

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2094 产生冠军 Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比 ...

  3. android开发系列之消息机制

    最近接触到一个比较有挑战性的项目,我发现里面使用大量的消息机制,现在这篇博客我想具体分析一下:android里面的消息到底是什么东西,消息机制到底有什么好处呢? 其实说到android消息机制,我们可 ...

  4. 快速的搭建JFinal的ORM框架示例

    JFinal默认用的是Freemarker作为视图. 所以,打架还是准备好俩个jar包吧! freemarker-2.3.16.jar JFinal-bin-1.5.jar 新建web工程和添加lib ...

  5. golang处理错误的艺术

    golang中关键API的调用都会在最后返回err(golang多值返回). 调用者可以选择处理, 或者不处理该err, 或原装返回给上一层的调用者. golang中的err是error类型, typ ...

  6. golang的goroutine与channel

    Golang的goroutine是非抢占式的, 令人相当蛋疼! 有痛不能呻吟...只能配合channel在各goroutine之间传递信号来实现抢占式, 而这形成了golang最灵活与最具性能的核心. ...

  7. pcre 使用

    1.主页地址:http://www.pcre.org/     下载pcre-7.8.tar.bz22.解压缩:     tar xjpf pcre-7.8.tar.bz23.配置:     cd p ...

  8. VS2013中常用的一些快捷键

    1.编辑时需要前后文切换: 需要自己设置为:ctrl+alt +方向键,向前查看,设置为右方向键,向后查看,设置为左方向键 依次选择:工具->选项->环境->键盘-> 2.查看 ...

  9. 着色Test

    1 2 3 4 5 6 7 8 9 10 def test:     print "just a test"     print "just a test"   ...

  10. 【Unique Binary Search Trees II】cpp

    题目: Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. F ...