poj 3710 Christmas Game 博弈论
思路:首先用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 博弈论的更多相关文章
- POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)
题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...
- poj 3710 Christmas Game【博弈论+SG】
也就是转换到树形删边游戏,详见 https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html #include<iostream> ...
- poj 3710 Christmas Game(树上的删边游戏)
Christmas Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1967 Accepted: 613 Des ...
- POJ 3710 Christmas Game#经典图SG博弈
http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏 ...
- POJ 3710 Christmas Game
知识储备: 解决办法(奇偶去环): (1) 对于长度为奇数的环,去掉其中任意一个边之后,剩下的 两个链长度同奇偶,抑或之后的 SG 值不可能为奇数,所 以它的 SG 值为 1: (2) 对于长度为 ...
- POJ 3710 Christmas Game [博弈]
题意:略. 思路:这是个删边的博弈游戏. 关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532 学习完预备知识后,这一 ...
- POJ 3710 无向图简单环树上删边
结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...
- Solution -「POJ 3710」Christmas Game
\(\mathcal{Decription}\) Link. 定义一棵圣诞树: 是仙人掌. 不存在两个同一环上的点,度数均 \(\ge 3\). 给出 \(n\) 棵互不相关的圣诞树,双人 ...
- POJ3710 Christmas Game 博弈论 sg函数 树的删边游戏
http://poj.org/problem?id=3710 叶子节点的 SG 值为0:中间节点的SG值为它的所有子节点的SG值加1后的异或和. 偶环可以视作一个点,奇环视为一条边(连了两个点). 这 ...
随机推荐
- Android中使用WebView, WebChromeClient和WebViewClient加载网页
在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android 中提供了其很好的支持, 其中webView的一系列用法,比如 webView.getSettings().s ...
- lucene .NET 搜索图片 功能实现
关于搜索部分 1想建立索引.构建jpg图片解析器,在索引时将jpg图片的exif信息及其文本信息如名称,存放路径,大小,日期等等加入索引!具体实现代码如下: public void BulidInde ...
- centos6.4 安装 hive 0.12.0
环境:centos6.4 64bit, 前提:hadoop已经正常运行,可以使用hadoop dfsadmin -report查看 hive 解压 tar zcvf hive-0.12.0.ta ...
- iOS学习之Object-C语言类和对象
一.OC语言的特点:封装,继承,多态:包含一个运行时系统:类库丰富. 二.面向对象 1.概述 OOP(Object Oriented Programming)面向对象编程. ...
- Redis 客户端配置及示例
一.redis自定义配置节点 <configSections> <section name ="RedisConfig" type="Amy.Toolk ...
- MNC - Multicast NetCat
MNC - Multicast NetCat 使用nc测试udp多播,总是遇到奇怪的问题,搞的一头雾水.偶然发现了MNC,测试了一下果然好用. 下载地址: https://github.com/mar ...
- 邻接表实现Dijkstra算法以及DFS与BFS算法
//============================================================================ // Name : ListDijkstr ...
- c++中-1是true呢还是false呢
今天想看一下引用c++中的,然后看到网上有问c++中-1是true or false呢?用vc6.0是了一下,是true.vc6.0中应该是非0的都是true,0为false.java我也试了一下,i ...
- .net如何判断网页是否由搜索引擎蜘蛛访问?
判断 this.Request.UserAgent Google的蜘蛛: Googlebot百度的蜘蛛:baiduspiderYahoo的蜘蛛:Yahoo SlurpMSN的蜘蛛:MsnbotAlta ...
- 【吐血推荐】简要分析unity3d中剪不断理还乱的yield
在学习unity3d的时候很容易看到下面这个例子: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yield ...