知识储备:

  解决办法(奇偶去环):

      (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. Java实现Socket之WhoisClient

    Java实现Socket之WhoisClient 代码内容 从常用的whois服务器的43号端口得到对应域名的所有注册信息并显示出来 代码实现 /* WhoisClient.java */ impor ...

  2. OpenGL Shader源码分享

    Opengl shader程序,旗帜混合纹理加载,通过N张图片,能够组合出数百个:http://www.eyesourcecode.com/thread-39015-1-1.html 用GLSL做了一 ...

  3. Iphone5s 通话质量差 问题解决

    从某段时间开始,我的手机出现通话质差的情况.而且与信号电平有密切关系,只要覆盖稍差的地方,通话就劣化. 具体症状是我时常听不清对方说话,但对方能够清晰听到我说话. 因为本人也是从事无线网络优化软件产品 ...

  4. 集成Spring后HibernateTemplate实现分页

    spring 整合 hibernate 时候用的 HibernateTemplate 不支持分页,因此需要自己包装一个类进行分页,具体实现如下...使用spring的hibernateTemplate ...

  5. OS X 使用技巧——在Finder窗口标题栏上显示路径

    Finder窗口默认显示当前文件夹的名称或当前所在的模式(例如AirDrop).如果想要显示路径(用User/[当前用户账号名称]/Documents 替代以前显示的Documents),打开终端并运 ...

  6. linux 操作

    正在运行的内核和系统信息 # uname -a # 获取内核版本(和BSD版本) # lsb_release -a # 显示任何 LSB 发行版版本信息 # cat /etc/SuSE-release ...

  7. bzoj 2038 莫队算法

    莫队算法,具体的可以看10年莫涛的论文. 大题思路就是假设对于区间l,r我们有了一个答案,那么对于区间l,r+1,我们 可以暴力的转移一个答案,那么对于区间l1,r1和区间l2,r2,需要暴力处理 的 ...

  8. Poj 1029 分类: Translation Mode 2014-04-04 10:18 112人阅读 评论(0) 收藏

    False coin Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16418   Accepted: 4583 Descr ...

  9. confusing uv

    in a projection u from letf to right is 0---1 in another proj u is the same but when i output u in r ...

  10. string为什么可以写入共享内存

    我今天在想这个vector,map为什么不能写入共享内存,原来是因为new的时候只是new了这个对象在共享内存上,而真正的堆上的内存并没有在共享内存里面的,如果要想vector 可以共享就要重写分配器 ...