poj3710 (无向图删边博弈)
引入:树上删边博弈
例题:给出一个有 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 (无向图删边博弈)的更多相关文章
- HDU5299 圆的扫描线 && 树上删边博弈
HDU5299 圆的扫描线 && 树上删边博弈 标签(空格分隔): 未分类 给出若干个圆,可以互相嵌套但不相交或相切. 每次删去一个圆和它内部的圆,进行博弈,问谁赢. 分成两部分.首先 ...
- 【Mark】博弈类题目小结(HDU,POJ,ZOJ)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小 ...
- POJ 3710 Christmas Game#经典图SG博弈
http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏 ...
- 博弈论BOSS
基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_c ...
- uestc_retarded 模板
虽然这个队,以后再也没有了,但是他的模板,是永垂不朽的![误 #include <ext/pb_ds/priority_queue.hpp> __gnu_pbds::priority_qu ...
- 【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 ...
- HDU 5299 Circles Game
HDU 5299 思路: 圆扫描线+树上删边博弈 圆扫描线有以下四种情况,用set维护扫描线与圆的交点,重载小于号 代码: #pragma GCC optimize(2) #pragma GCC op ...
- 算法笔记--sg函数详解及其模板
算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...
- hdu 3435(KM算法最优匹配)
A new Graph Game Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hihoCoder#1181(欧拉路径)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一 ...
随机推荐
- 详细讲解js实现电梯导航
场景 对于某一个页面内容繁多, 如果我们滚动的时间较长,为了增加用户体验. 我们需要实现点击某一个按钮,然后滚动到对应的区域. 滚动的时候,右侧对应的分类实现高亮 其实,这个功能就2个步骤: 1.点击 ...
- 从 DMAIC 方法论说起,记一个长链接 bug 的排查全过程
引 本文是我在前端团队的第四次分享,在过去我曾做过一次关于 bug 排查的全流程的排查分析,文档:客户线上反馈:从信息搜集到疑难 bug 排查全流程经验分享,但这个文章更侧重我过去几年的排查经验,而非 ...
- PHP写一个 Api接口需要注意哪些?考虑哪些?
随着互联网的飞速发展,前后端分离的开发模式越来越流行.编写一个稳定.可靠和易于使用的 API 接口是现代互联网应用程序的关键.本文将介绍在使用 thinkphp6 框架开发 API 接口时需要注意的要 ...
- [Python] 今天开始学习Python3了, 纪念一下
#! /usr/bin/env python3 import time print("你好, 请告诉我你的名字.") name = input("名前: ") ...
- java获取服务器ip地址的工具类
参考: https://www.cnblogs.com/raphael5200/p/5996464.html 代码实现 import lombok.extern.slf4j.Slf4j; import ...
- Solution -「NOI 2021」轻重边
Description Link. 给出一棵树,初始边权为 \(0\),支持毛毛虫虫体赋 \(1\),虫足赋 \(0\),以及查询路径边权和操作,\(n,m\leqslant 10^5\). Solu ...
- Record - Stirling Number / FK. & SK.
Part. 1 Stirling Number / FK. Def. 定义 \(\begin{bmatrix}n \\ m\end{bmatrix}\) 表示将 \(n\) 个元素分成 \(m\) 个 ...
- nacos2.X版本无法注册的几个原因以及解决方案(踩坑避雷!)
在使用nacos+dubbo 注册服务的时候 遇到了无法注册的问题 记录一下踩的坑以及解决方案 com.alibaba.nacos.api.exception.NacosException: Requ ...
- 深入解析 C++ 中的 ostringstream、istringstream 和 stringstream 用法
引言: 在 C++ 中,ostringstream.istringstream 和 stringstream 是三个非常有用的字符串流类,它们允许我们以流的方式处理字符串数据.本文将深入探讨这三个类的 ...
- ESS、RSS、TSS
回归平方和 ESS,残差平方和 RSS,总体平方和 TSS 残差平方和越小,自变量与因变量之间的相关性越好 总变差(TSS):被解释变量Y的观测值与其平均值的离差平方和(总平方和)(说明 Y 的总变动 ...