poj 3710 Christmas Game 博弈论】的更多相关文章

思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<vector> #include<cstring> using namespace std; int ans; vector<…
题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮流从树上删边,删去一条边后,不与根相连的一部分会被移除.最后无法移动的人输.问谁能赢. \(Solution\) 如果没有环,那就是典型的树上删边游戏 考虑环,没有共用边且与树只有一个交点,那这是一个从树上某点\(x\)连出最后又连回这个点的简单环. 删除环上一边后会形成两条链 -> Multi-SG…
也就是转换到树形删边游戏,详见 https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1005; int T,n,m,cnt,h[N],w[N],s[N],top; bool v[N],ve[N]; struct qwe { int n…
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…
http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏略述--浅谈SG游戏的若干拓展及变形>) 首先,对于无向图的删边游戏有如下定理性质: 1.(Fushion Principle定理)我们可对无向图做如下改动:将图中的任意一个偶环缩成一个新点,任意一个奇环缩成一个新点加一个新边:所有连到原先环上的边全部改为与新点相连:这样的改动不影响图的SG值. 2.(…
知识储备: 解决办法(奇偶去环):   (1) 对于长度为奇数的环,去掉其中任意一个边之后,剩下的 两个链长度同奇偶,抑或之后的 SG 值不可能为奇数,所 以它的 SG 值为 1: (2) 对于长度为偶数的环,去掉其中任意一个边之后,剩下的 两个链长度异奇偶,抑或之后的 SG 值不可能为 0,所以它 的 SG 值为 0: #include<stdio.h> #include<string.h> #include<algorithm> #include<vector…
题意:略. 思路:这是个删边的博弈游戏. 关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532 学习完预备知识后,这一题就不难了. 首先,用tarjan算法找到每棵树中的双连通分量(即树枝上的多边形),根据Fusion Principle,如果多边形有奇数条边,可以简化为1条边,如果有偶数条边,则可以简化为1个点.代码中使用了vis数组,对于前者,使环内所有的点(包括悬挂点)的vis值为1,后面计算sg值时便不会再…
结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @FileName: POJ 3710 简单环 树上删边 DFS.cpp * @Platform: Windows * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : https://github.com/ * @Version : $Id$ */ #i…
\(\mathcal{Decription}\)   Link.   定义一棵圣诞树: 是仙人掌. 不存在两个同一环上的点,度数均 \(\ge 3\).   给出 \(n\) 棵互不相关的圣诞树,双人博弈,每轮切断一棵圣诞树的一条边,并且与该树根不向连的部分全部消失,不能操作者负.求先手是否有必胜策略.   多测,\(T,n\le 100\),\(m\le 500\). \(\mathcal{Solution}\)   没有什么不说人话的定理和结论,这里只应用 SG 函数和 Nim 游戏的基础知…
http://poj.org/problem?id=3710 叶子节点的 SG 值为0:中间节点的SG值为它的所有子节点的SG值加1后的异或和. 偶环可以视作一个点,奇环视为一条边(连了两个点). 这道题有两个需要注意的地方,这道题是多样例测试和这道题中两点之间形成的环要特判. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream…
Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the edge)尽量的小.转换后就是求根节点到每一个节点的距离最短,也就是最短路. 生成树可能会超时.我没试过.然后,求解最短路要用优化的解法不然会超时.最后的答案就是:sum = w[1] * dist[1] + w[2] * dist[2] + ..... w[n] * dist[n].能够自己推推例…
[题目链接] http://poj.org/problem?id=2975 [题目大意] 问在传统的nim游戏中先手必胜策略的数量 [题解] 设sg=a1^a1^a3^a4^………^an,当sg为0时为必败态, 因此先手只需改变一个aj,让其减少m,使得sg^aj^(aj-m)=0即可让对手处于必败态, 即先手必胜策略,因为异或为0的两个数相同,所以sg^aj=aj-m, 即m=aj-sg^aj,因为m大于0,所以aj>sg^aj,至此我们就得到了必胜策略的重要条件 [代码] #include…
[题目链接] http://poj.org/problem?id=2068 [题目大意] 给出两队人,交叉放置围成一圈,每个人能取的石子数有个上限,各不相同 轮流取石头,取到最后一块石头的队伍算输,问哪个队伍能赢 [题解] 用dp[i][j]记录第i个人取石头时候还有j个石头的状态, 显然j==0时候为必胜态,我们对每个状态搜索后继状态,如果能导向必败态则为必胜态, 否则必败,记忆化搜索即可. [代码] #include <cstdio> #include <cstring> us…
思路:总共有18条边,9个三角形. 极大极小化搜索+剪枝比较慢,所以用记忆化搜索!! 用state存放当前的加边后的状态,并判断是否构成三角形,找出最优解. 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include<iomanip> #include<cmath> #include<cstring> #include<vector> #d…
思路:求SG函数!! 代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; ][]; int getsg(int m,int n) { ) return sg[m][n]; ]; memset(vis,,sizeof(vis)); ;i<=m/;i++) vis[getsg(i,n)^getsg(m-i,n)]=;…
Description 给出矩阵 \(n*n\) 的 矩阵\(A\) , 求 \(A^1+A^2+A^3...+A^k\) Solution 首先我们设 \(S_n=\sum_{i=1}^{n}A^i\) 容易得到结论 : \(S_{a+b}=S_{a}*A_{b}+S_{b}\) 于是我们可以把 \(k\) 二进制分解 , 拆成每一个 \(S_{2^i}\) 的形式再按上面的结论合并就行了. \(S_{2^i}\) 也可以用上述结论倍增求出. 注意这样会多算一个单位矩阵 , 最后减去就行了.…
树的删边游戏.. 由于题目的特殊性,我们只需计算环的边数值.若为偶环,则直接把环的根节点置0.若为奇环,则留下一条边与根结点相连,并那它们的SG置0: 注意的是,两个点也可构成环,因为允许重边.所以,我们只需求点双连通分量,并判断分量中边的数量即可.然后DFS求树的SG值. #include <iostream> #include <cstdio> #include <cstring> using namespace std; ; ; int n,m; struct {…
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质:         1.所有终结点是 必败点 P .(我们以此为基本前提进行推理,换句话说,我们以此为假设)         2.从任何必胜点N 操作,至少有一种方式可以进入必败点 P.         3.无论如何操作,必败点P 都…
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质:         1.所有终结点是 必败点 P .(我们以此为基本前提进行推理,换句话说,我们以此为假设)         2.从任何必胜点N 操作,至少有一种方式可以进入必败点 P.         3.无论如何操作,必败点P 都…
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质:         1.所有终结点是 必败点 P .(我们以此为基本前提进行推理,换句话说,我们以此为假设)         2.从任何必胜点N 操作,至少有一种方式可以进入必败点 P.         3.无论如何操作,必败点P 都…
博弈论 贾志豪论文上的题目……题解请看论文 Orz了一下Hzwer Source Code Problem: User: sdfzyhy Memory: 716K Time: 0MS Language: G++ Result: Accepted Source Code //POJ 3710 #include<cstdio> #include<cstring> #include<iostream> #define F(i,j,n) for(int i=j;i<=n;…
一.代码: 1.求逆元(原理貌似就是拓展欧几里得,要求MOD是素数): int inv(int a) { if(a == 1) return 1; return ((MOD - MOD / a) * inv(MOD % a)) % MOD; } 2.底层优化(正确性未验证): int cmp(int a) {if (!a) return 0; return a < 0 ? -1 : 1;} int cmp(int a) {return (a >> 31) + (-a >> 3…
算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/luomingjun12315/article/details/45555495 sg[i]定义,从i走一步能到达的j的sg[j]以外的最小值,那么从sg函数值为x的状态出发,我们能转移到sg值为0,1,...,x-1的状态 对于某个人来说,0是他的必败态,sg[0] = 0 我们从这个状态出发,用d…
http://poj.org/problem?id=2234 博弈论真是博大精深orz 首先我们仔细分析很容易分析出来,当只有一堆的时候,先手必胜:两堆并且相同的时候,先手必败,反之必胜. 根据博弈论的知识(论文 张一飞:<由感性认识到理性认识——透析一类搏弈游戏的解答过程>) 局面可以分解,且结果可以合并. 局面均是先手 当子局面是 胜 和 败,那么局面则为胜 当子局面是 败 和 胜,那么局面则为胜 当子局面是 败 和 败,那么局面则为败 当子局面为 胜 和 胜,那么局面为不确定 而这些性质…
http://poj.org/problem?id=3013 Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 19009   Accepted: 4048 Description Christmas is coming to KCM city. Suby the loyal civilian in KCM city is preparing a big neat Christmas…
POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意:  圣诞树是由n个节点和e个边构成的,点编号1-n.树根为编号1,选择一些边.使得全部节点构成一棵树.选择边的代价是(子孙的点的重量)×(这条边的价值). 求代价最小多少. 分析:  单看每一个点被计算过的代价,非常明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 只是坑点还是非常多的. 点的数量高达5w个,用矩阵存不行.仅仅能用边存.…
Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20974   Accepted: 4535 Description Christmas is coming to KCM city. Suby the loyal civilian in KCM city is preparing a big neat Christmas tree. The simple structure of t…
POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int main() { int n,m; while(scanf("%d %d",&n,&m) != EOF){ if( n > m) swap(n,m); doubl…
http://poj.org/problem?id=2348 顺便说,必应翻译真的好用,比谷歌翻译好用100倍. 很难判断这道题的具体博弈类型. 有两种写法,一种是找规律,一种是推理得到关系后循环(或递归)处理.两种写法都能在题目下面的discuss中找到. 1.找规律,我在这里直接复制了discuss中大神算出的sg函数表(在考试中这种写法是很值得借鉴的,这里就体现出代码能力的重要了,找规律天下第一!). 我算了一下前 30 × 30 的 Sprague-Grundy 函数表,如下: 0 1…
poj1704 Georgia and Bob 题目链接:http://poj.org/problem?id=1704 题意:如图所示,两个人在玩一个游戏,排成直线的格子上有n个棋子,两人依次将棋子向左移动可以移动任意格子,但是不能超过前面的棋子,也不允许将两个棋子放在同一个格子里面,无法进行移动的一方失败,问对于某个状态先手是否能赢. 分析:若n为偶数,则将棋子两两分为一组,转化为Nim,棋子间的格子即为每个数,若右边的格子左移则可视为取走了石子,若左边的格子左移,第二个人只要将增加的格子减去…