博弈论之树上删边游戏

可以说成是树上的NIM游戏嘛

POJ3710

再树上删边,树是带环的,然后基本题意还是和NIM游戏一致

按环分类讨论,如果是奇数环

所有后继SG值都会是偶数,所以这个状态SG为1

把环缩成一个点+1条边

如果是偶数环,那么后继SG非0,此环SG=1,就将环缩为1个点

对于环,利用tarjan+栈预处理

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=1005;
 4 int n,m,top,cnt;
 5 bool vis[maxn],ve[maxn];
 6 int g[maxn],w[maxn],s[maxn];
 7 struct Edge
 8 {
 9     int t,next;
10 }e[maxn*2];
11 void insert(int u,int v)
12 {
13     cnt++;e[cnt].t=v;e[cnt].next=g[u];g[u]=cnt;
14     cnt++;e[cnt].t=u;e[cnt].next=g[v];g[v]=cnt;
15 }
16 int dfs(int x)
17 {
18     vis[x]=1;
19     int ans=0;
20     s[++top]=x;
21     for(int tmp=g[x];tmp;tmp=e[tmp].next)
22     {
23         if(!ve[tmp])
24         {
25             ve[tmp]=1;ve[tmp^1]=1;
26             int temp;
27             if(!vis[e[tmp].t]) temp=dfs(e[tmp].t)+1;
28             else
29             {
30                 int q=s[top--];
31                 while(q!=e[tmp].t)
32                 {
33                     w[q]=1;
34                     q=s[top--];
35                 }
36                 ++top;
37                 return 1;
38             }
39             if(w[e[tmp].t]) ans^=(temp)%2;
40             else ans^=temp;
41         }
42     }
43     return ans;
44 }
45 int main()
46 {
47     int T,ans,x,y;
48     while(scanf("%d",&T)==1)
49     {
50         ans=0;
51         while(T--)
52         {
53             memset(g,0,sizeof(g));
54             memset(vis,0,sizeof(vis));
55             memset(ve,0,sizeof(ve));
56             memset(w,0,sizeof(w));
57             top=0;cnt=1;
58             scanf("%d%d",&n,&m);
59             for(int i=0;i<m;i++)
60             {
61                 scanf("%d%d",&x,&y);
62                 insert(x,y);
63             }
64             ans^=dfs(1);
65         }
66         if(ans) puts("Sally");
67         else puts("Harry");
68     }
69     return 0;
70 }

原文地址:https://www.cnblogs.com/aininot260/p/9580087.html

时间: 2024-08-29 19:23:20

博弈论之树上删边游戏的相关文章

hdu 5299(树上删边游戏) Circles Game

题意: 给你一些圆圈的圆心坐标和半径,保证这些圆圈是包含或者相离的.现在两个人做博弈操作,拿掉一个圆圈,然后这个圆圈所包含的都要移除掉.两个人一直拿下去,直到某个人找不到一个可以移除的圈他就输了. 思路 学习的姿势.这是一个树上删边游戏模型: 首先按照半径升序排序,然后对于每一个圆找第一个包含它的圆,然后连一条边.建树完成. 叶子节点的SG值为0; 中间节点的 SG 值为它的所有子节点的 SG 值加 1 后的异或和; 这里可以建立成森林或者直接一棵树,没有太大区别.建成一棵树估计要方便一些吧.

【HDU 3590】 PP and QQ (博弈-Anti-SG游戏,SJ定理,树上删边游戏)

PP and QQ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 510    Accepted Submission(s): 256 Problem Description PP and QQ were playing games at Christmas Eve. They drew some Christmas trees on

codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)

题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删就输了 数据范围: $1\leq n \leq 100000$ $1\leq q \leq 100000$ $1\leq |s| \leq 40$ 分析: ac代码: #include<bits/stdc++.h> using namespace std; #define ll long long

博弈——无向图删边游戏

关于无向图删边游戏,首先游戏的规则如下: 然后看下最关键的定理: 叶子节点的 SG 值为 0; 中间节点的 SG 值为它的所有子节点的 SG 值 加 1 后的异或和. 精彩证明: 有了这个定理,这个问题就可以轻松用sg函数搞定了. 然后再来看几个变形. 1. 可以发现,得到两个关键性质,直接就可以转变为树上删边游戏了. 2. 对于这种情况只需要不停的找环,然后缩点,变成树即可解决. 本文大部分根据 贾志豪的 <组合游戏略述——浅谈 SG 游戏的若干拓展及变形 >得到.

【BZOJ 2688】 2688: Green Hackenbush (概率DP+博弈-树上删边)

2688: Green Hackenbush Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 42  Solved: 16 Description 有一个古老的游戏叫做Green Hackenbush,游戏是这样进行的:两个人轮流在一棵树上删边,每次删边后不与根联通的子树直接被ignore,不能删边的游戏者输.Alice和Bob也在玩这个游戏,不过他们面对的是n棵树,第i棵树是含有a[i]个节点的二叉树.先手的Alice想知道自己有多大的概率获胜(

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

Christmas Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1967   Accepted: 613 Description Harry and Sally were playing games at Christmas Eve. They drew some Christmas trees on a paper: Then they took turns to cut a branch of a tre

[北京集训测试赛(五)/HDU5299]圆圈游戏(Circles game)-树上删边-圆的扫描线

Problem 遗产 题目大意 一个平面上n个圆,任两个圆只会相离或包含,给出每个圆位置与半径. alice&&bob轮流取圆,每取一个就可以取出这个圆以及被这个圆包含的圆. 没圆取的人输,alice先取,问谁有必胜策略. Solution Method #1 首先我们考虑一个暴力一点的写法: 先将圆半径从小到大排序,然后枚举两个圆,判断是否包含关系. 如果包含的话就将大圆连一条边到小圆. 很容易发现,这样执行完以后得到了一棵树. 我们接下来要做的事情就变成了: 每个人可以轮流从树上删除一

【POJ3710】Christmas Game 博弈 有限制的图上删边游戏(树形删边游戏进化1)

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671885 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意: 一个树图,然后1永远是根,两人轮流删边,不能删者输. 删边限制:只能删跟1连通的边. 树图限制: 它首先是一棵树,然后某些点上可能带一个环 原描述:最开始的图是一颗带有一些简单环的树,然后任何边都至多在一个多边形上.每个多边形最多有一个节点出现在主树上. 给个神犇论文地址: 石家庄二中·贾志豪-- <组合

【博弈论】BZOJ 1115-石子游戏

题意:有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作 每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件 谁没有石子可移时输掉游戏.问先手是否必胜. 这个题是一个阶梯博弈的问题.一开始没有接触过,各种度娘然后搞懂了,赶快记下来. 何为阶梯博弈? 简单的用Nim来说,一段台阶上,每个台阶上放了一堆石子,每次能从除了第一阶的台阶上取任意多石子向下放一级.无法操作的人输. 神犇告诉我,这个游戏的SG值就是奇数阶梯的SG值Xor起来...跪拜. 那