POJ 3710 Christmas Game
知识储备:
解决办法(奇偶去环):
(1) 对于长度为奇数的环,去掉其中任意一个边之后,剩下的
两个链长度同奇偶,抑或之后的 SG 值不可能为奇数,所
以它的 SG 值为 1;
(2) 对于长度为偶数的环,去掉其中任意一个边之后,剩下的
两个链长度异奇偶,抑或之后的 SG 值不可能为 0,所以它
的 SG 值为 0;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>edge[]; //邻接表
int mat[][]; //存放边的数量
int low[],dfa[]; //Tarjan参量
int s[],top; //堆栈
bool instack[];
bool vis[]; //在Tarjan找环之后,把不需要的点标记掉
void Tarjan(int u,int pre,int depth)
{
low[u]=dfa[u]=depth;
s[top++]=u;
instack[u]=true;
for(int i=; i<edge[u].size(); i++)
{
int v=edge[u][i];
if(v==pre&&mat[u][v]>) //判断重边
{
if(mat[u][v]%==)
vis[u]=true;
continue;
}
if(!dfa[v])
{
Tarjan(v,u,depth+);
low[u]=min(low[u],low[v]);
}
else if(v!=pre&&instack[v])
low[u]=min(low[u],dfa[v]);
}
if(dfa[u]==low[u])
{
int cnt=;
top--;
while(s[top]!=u)
{
vis[s[top--]]=true;
cnt++;
}
if(cnt&&(cnt&)) //如果节点为奇数,则保留一个点,包括u,也就是两个点,保留一条边
vis[s[top+]]=false;
}
}
int get_sg(int u,int pre)
{
int ret=;
for(int i=; i<edge[u].size(); i++)
{
int v=edge[u][i];
if(!vis[v]&&v!=pre)
ret^=(+get_sg(v,u));
}
return ret;
}
int main()
{
int k,n,m;
while(scanf("%d",&k)!=EOF)
{
int ret=;
while(k--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
edge[i].clear();
memset(mat,,sizeof(mat));
memset(low,,sizeof(low));
memset(dfa,,sizeof(dfa));
memset(instack,false,sizeof(instack));
memset(vis,false,sizeof(vis));
top=;
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
mat[u][v]++;
mat[v][u]++;
edge[u].push_back(v);
edge[v].push_back(u);
}
Tarjan(,-,);
ret^=get_sg(,-);
}
puts(ret?"Sally":"Harry");
}
return ;
}
POJ 3710 Christmas Game的更多相关文章
- 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 博弈论
思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ...
- POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)
题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...
- POJ 3710 Christmas Game [博弈]
题意:略. 思路:这是个删边的博弈游戏. 关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532 学习完预备知识后,这一 ...
- poj 3710 Christmas Game【博弈论+SG】
也就是转换到树形删边游戏,详见 https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html #include<iostream> ...
- POJ 3710 无向图简单环树上删边
结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...
- Solution -「POJ 3710」Christmas Game
\(\mathcal{Decription}\) Link. 定义一棵圣诞树: 是仙人掌. 不存在两个同一环上的点,度数均 \(\ge 3\). 给出 \(n\) 棵互不相关的圣诞树,双人 ...
- POJ Big Christmas Tree(最短的基础)
Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...
随机推荐
- Labview实现字符串加密
Labview实现字符串加密 对字符串进行加密,规则是每个字母后移5 位 例如A 变为F,b 变为g,x 变为c,y 变为d- 实现效果 后端实现
- QT 按钮类继承处理带定时器
01.class KeyButton : public QPushButton 02.{ 03. Q_OBJECT 04.public: 05. explicit KeyButto ...
- 网络笔记02数据解析 -1-JSON解析
1.JSON解析 1.JSON介绍 JSON是最网络传输数据最为广泛的数据格式,没有之一,出身草根,是Javascript的子集,专门负责描述数据格式.Javascript是网页开发的一种脚本语言,和 ...
- “我爱淘”冲刺阶段Scrum站立会议1
昨天是我们项目冲刺阶段的第一天,站立会议的内容如下: 1.昨天完成了项目中的第一个界面--“精选”界面:完成了一点Java文件的编写: 2.今天的任务就是完成第一个Activity的编写:将布局文件和 ...
- android 通过httpclient下载文件并保存
代码:(主要针对图片.gif下载无问题) /** * 下载网络文件 * @param url 请求的文件链接 * @param IsMD5Name 是否MD5加密URL来命名文件名 * @param ...
- C#和asp.net执行外部EXE程序
这两天研究下.Net的执行外部EXE程序问题,就是在一个程序里通过按钮或其他操作运行起来另外一个程序,需要传入参数,如用户名.密码之类(实际上很类似单点登录,不过要简单的多的多):总结如下: 1.CS ...
- 【Simplify Path】cpp
题目: Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/&quo ...
- UVALive - 6955 Finding Lines 随机算法
题目链接: http://acm.hust.edu.cn/vjudge/contest/126968#problem/F 题意 给你n个点,问是否有>=p/100*n个点共线(p>=20& ...
- hdu 3926 Hand in Hand 同构图
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926 In order to get rid of Conan, Kaitou KID disguis ...
- hdu 4858 项目管理 图的分块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能 ...