引入:树上删边博弈

例题:给出一个有 N个点的树,有一个点作为树的根节点。游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走。谁无法移动谁输。

结论:叶子节点的SG值为0;中间节点的SG值为它的所有子节点的SG值加1后的异或和。根节点SG值非0先手胜。

无向图的删边博弈

例题(poj 3710): 一个无向联通图,有一个点作为图的根,一条边最多涉及一个环,每个环只有一个结点与树相连。游戏者轮流从图中删去边,删去一条边后,不与根节点相连的部分将被移走。谁无法继续操作谁输。

输入格式:多组输入。每个测试用例的第一行是一个整数N(N<100),它表示子树的数目。第一行是节点数m(m<100)和边数k(k<500)。树的节点从1到m编号。以下每行包含2个整数a和b,表示一条边<a,b>。节点1始终是根。

输出格式:对于每组测试数据,输出胜者姓名。

结论:将图中的任意一个偶环缩成一个新点,任意一个奇环缩成一个新点加一个新边;所有连到原先环上的边全部改为与新点相连。这样的改动不会影响图的SG 值。然后就是树上删边博弈。

#include<cstdio>
#include<cstring>
#define min(a,b) (a<b ? a:b) int cnt,n,m,k,x,y,top,sg,tot;
int head[105],dfn[105],low[105],sta[105],kk[105][105];
bool vis[105],in[105]; struct Node{
int nex,to;
}e[1005]; inline void add(int a,int b){
++cnt;
e[cnt].nex = head[a];
e[cnt].to = b;
head[a] = cnt;
} void init(){
cnt = tot = top = 0;
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
memset(kk,0,sizeof(kk));
} void tarjan(int u,int f){
sta[++top] = u, in[u] = 1;
low[u] = dfn[u] = ++tot;
for(int i = head[u]; i; i = e[i].nex){
int to = e[i].to;
if(to == f && kk[to][u]>1){
if(kk[to][u]%2 == 0) vis[u] = 1;
continue;
}
if(!dfn[to]){
tarjan(to,u);
low[u] = min(low[u],low[to]);
}
else if(to != f && in[to]) low[u] = min(low[u],dfn[to]);
}
if(dfn[u] == low[u]){
int num = 1;
while(sta[top] != u){
++num, in[sta[top]] = 0;
vis[sta[top--]] = 1;
}
--top, in[u] = 0;
if((num&1) && num > 1) vis[sta[top+2]] = 0;
}
} int get_sg(int u,int f){
int sg = 0;
for(int i = head[u]; i; i = e[i].nex){
int to = e[i].to;
if(to != f && !vis[to]) sg ^= (get_sg(to,u)+1);
}
return sg;
} int main(){
while(scanf("%d",&n) != EOF){
sg = 0;
while(n--){
scanf("%d%d",&m,&k); init();
for(int i = 1; i <= k; ++i){
scanf("%d%d",&x,&y);
add(x,y), add(y,x);
++kk[x][y], ++kk[y][x];
}
tarjan(1,-1);
sg ^= get_sg(1,-1);
}
if(sg) puts("Sally"); else puts("Harry");
}
return 0;
}

poj3710 (无向图删边博弈)的更多相关文章

  1. HDU5299 圆的扫描线 && 树上删边博弈

    HDU5299 圆的扫描线 && 树上删边博弈 标签(空格分隔): 未分类 给出若干个圆,可以互相嵌套但不相交或相切. 每次删去一个圆和它内部的圆,进行博弈,问谁赢. 分成两部分.首先 ...

  2. 【Mark】博弈类题目小结(HDU,POJ,ZOJ)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小 ...

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

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

  4. 博弈论BOSS

    基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_c ...

  5. uestc_retarded 模板

    虽然这个队,以后再也没有了,但是他的模板,是永垂不朽的![误 #include <ext/pb_ds/priority_queue.hpp> __gnu_pbds::priority_qu ...

  6. 【HDU 3435】 A new Graph Game (KM|费用流)

    A new Graph Game Problem Description An undirected graph is a graph in which the nodes are connected ...

  7. HDU 5299 Circles Game

    HDU 5299 思路: 圆扫描线+树上删边博弈 圆扫描线有以下四种情况,用set维护扫描线与圆的交点,重载小于号 代码: #pragma GCC optimize(2) #pragma GCC op ...

  8. 算法笔记--sg函数详解及其模板

    算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...

  9. hdu 3435(KM算法最优匹配)

    A new Graph Game Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. hihoCoder#1181(欧拉路径)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一 ...

随机推荐

  1. nginx搭建静态文件下载服务器

    配置文件大致内容 server { # 监听8001端口 listen 8001; server_name 192.168.0.2; # 指定使用utf8的编码 charset utf-8; # 内容 ...

  2. Go面经 | 成都Go面试这么卷?卷王介绍:游戏行业 3年经验 20k+

    Go最新面经分享:算法.并发模型.缓存落盘.etcd.actor模型.epoll等等... 本文先分享2段面经,文末总结了关键问题的复盘笔记.一定要看到最后! 求职者情况 分享一下好友的最新面经. 简 ...

  3. docker搭建CMS靶场

    项目地址:https://github.com/Betsy0/CMSVulSource 该项目是为了方便在对CMS漏洞进行复现的时候花费大量的时间在网上搜索漏洞源码,从而有了此项目.此项目仅为安全研究 ...

  4. LDA主题模型讲解及代码Python实现

    目录 1. LDA主题模型详解 1.1 Beta/Dirichlet 分布的一个性质 1.2 LDA-math-MCMC 1.2.1 重要理解 1.3 Gibbs Sampling 2. 所需工具库 ...

  5. 【Cucumber】关于BDD自然语言自动化测试的语法总结

    1.关键字 - Feature 每一个.feature文件必须以关键字Feature开始,Feature关键字之后可以添加该feature的描述,其作用类似于注释,仅仅为了便于理解沟通交流,描述内容中 ...

  6. MySQL PXC集群新增一个高版本节点

    已有的一个 MySQL PXC 集群环境,因为种种原因仅剩一个节点 node1,需要新增一个集群节点 node2. node1 版本:donor version (8.0.21) node2 版本:l ...

  7. np.random.beta

    numpy.random.beta(a,b,size=None) 从β分布中提取样本.β分布是狄里克莱分布的一个特例,与伽马分布有关. 在这里我们将参数(3个参数)设置为32 32 3 参数1:32次 ...

  8. 轻松掌握组件启动之MongoDB(下):高可用复制集架构环境搭建

    引言 上一章节中,我们详细介绍了在典型的三节点复制集环境中搭建MongoDB的步骤和注意事项.从准备配置文件到启动MongoDB进程,我们一步步指导读者完成了环境的设置.在本章节中,我们将进一步深入, ...

  9. Util应用框架Web Api开发环境搭建

    要使用Util应用框架开发项目,首先需要搭建合适的开发环境. 迈出第一步,对于很多.Net新人可能并不简单. 如果你对.Net环境并不熟悉,请尽量按照本文档进行操作. 操作系统 请安装 Windows ...

  10. Memcached的基本操作

    一.Memcache使用场景1.非持久化存储:对数据存储要求不高2.分布式存储:不适合单机使用3.key/value存储:格式简单,不支持list,array数据格式二.系统类$m=new Memca ...