知识储备:

  解决办法(奇偶去环):

      (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的更多相关文章

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

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

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

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

  3. poj 3710 Christmas Game 博弈论

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

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

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

  5. POJ 3710 Christmas Game [博弈]

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

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

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

  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. POJ Big Christmas Tree(最短的基础)

    Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...

随机推荐

  1. oc中对象的初始化

    在.m文件中使用对象方法: - (id)init { _name =@"zhangsan"; _age = 18; return self; } 然后通过main方法中进行创建对象 ...

  2. [转]insmod

    [转]insmod http://www.cnblogs.com/amaoxiaozhu/archive/2013/03/08/2950002.html 在Linux下,驱动程序是内核的一部分,运行在 ...

  3. MVVMLight leaning note

    Learning Note For MvvmLight MvvmLight quitstart refer link1 : MVVMLight HelloWorld *** mc:Ignorable ...

  4. 零基础学习Linux(三)linux与windows文件共享

    上次的博文零基础学习Linux(一)环境搭建中我们已经将linux环境部署完毕了,接下来我们就可以在linux上进行软件的安装和环境的配置.但在进行这些操作之前,我们还需要解决一个问题——Linux与 ...

  5. iOS UIView的简单渐变效果

    这里主要用到了ios4.0以后 UIView的类方法 animateWithDuration: 函数原型包括以下类方法 + (void)animateWithDuration:(NSTimeInter ...

  6. 格式化输出[parts/iomanip]

    /* 用ios类中的成员函数来进行IO格式的控制总需要写一条单独的语句,而不能直接嵌入到IO语句中,显得很不方便,因此C++又提供了一种用操作符来控制IO的格式.操作符分为带参和不带参两种,带参的定义 ...

  7. xml之基础了解

    1.简介 1>什么XML语言(eXtensible Markup Language) 可扩展标记语言XML是SGML的子集,其目标是允许普通的SGML在Web上以目前HTML的方式被服务.接受和 ...

  8. HDU 3555 Bomb 数位dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Mem ...

  9. 求字符串的最长回文字串 O(n)

    昨天参加了某公司的校园招聘的笔试题,做得惨不忍睹,其中就有这么一道算法设计题:求一个字符串的最长回文字串.我在ACM校队选拔赛上遇到过这道题,当时用的后缀数组AC的,但是模板忘了没写出代码来. 回头我 ...

  10. 在linux中使用phpize安装php扩展模块

    介绍:linux系统中,php安装成功后,在bin目录下会生成一个名叫phpize的可执行脚本,这个脚本的用途是动态安装php扩展模块.使用phpize脚本安装php扩展模块的好处:在安装php时没有 ...