引入:树上删边博弈

例题:给出一个有 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深入:nginx功能模块、目录结构及配置文件详解

    Nginx功能模块说明 1.Nginx 核心功能模块(Core functionality) Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的核心层(Main层)和事件(Event ...

  2. BUUCTF-RE-[BJDCTF2020]BJD hamburger competition

    啊这,点进去康康 dnspy反编译的题,https://www.52pojie.cn/thread-495115-1-1.html 里面有详细介绍 然后文件很多,我不知道找哪一个下手 看其他师傅的wp ...

  3. salesforce零基础学习(一百三十)Report 学习进阶篇

    本篇参考: https://help.salesforce.com/s/articleView?id=sf.reports_summary_functions_about.htm&type=5 ...

  4. 循环神经网络RNN完全解析:从基础理论到PyTorch实战

    在本文中,我们深入探讨了循环神经网络(RNN)及其高级变体,包括长短时记忆网络(LSTM).门控循环单元(GRU)和双向循环神经网络(Bi-RNN).文章详细介绍了RNN的基本概念.工作原理和应用场景 ...

  5. GitHub Actions CI/CD 工作流实战

    1. 什么是 GitHub Actions 与 workflow ? GitHub Actions 是 GitHub 提供的一种持续集成(CI)和持续部署(CD)的工具,用于自动化软件开发过程中的各种 ...

  6. 数据库安装postgresql

    数据库安装postgresql 目录 数据库安装postgresql 1.数据库源替换下载 2.初始化数据库并启动安装 3.登录数据库设置密码 4.常用命令 一.常用命令 二.用户 三.权限 四.模式 ...

  7. 关于TCP 四次挥手过程中的reset包问题

    数据包过程 TCP状态机转换过程 客户端在接受到第32个数据包之后,应该发送1个对FIN的ACK数据包,然而客户端缺直接连续发送了3个Rest数据包36~38,客户端并未进入time wait阶段,直 ...

  8. C++ 转换构造函数

    在 C++ 中如果一个构造函数只有一个参数,那么这个构造函数就是转换构造函数(Converting Constructor),这个构造函数可以将参数类型转换成构造函数所在的类对应的类型. 举个例子,假 ...

  9. pandas处理大数据题目的操作

    1.用法:DataFrame.drop(labels=None, axis=0, index=None, columns=None, inplace=False) 2.参数说明: labels:要删除 ...

  10. 【vulnhub】——DC-9靶机

    [vulnhub]--DC-9靶机 1. 主机发现 扫描kali主机C段(Kali和DC-9主机在同一个网关下): 发现主机为192.168.108.146,进行详细端口扫描: 可以看到靶机开了一个s ...