题意:略。

思路:这是个删边的博弈游戏。

关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532

学习完预备知识后,这一题就不难了。

首先,用tarjan算法找到每棵树中的双连通分量(即树枝上的多边形),根据Fusion Principle,如果多边形有奇数条边,可以简化为1条边,如果有偶数条边,则可以简化为1个点。代码中使用了vis数组,对于前者,使环内所有的点(包括悬挂点)的vis值为1,后面计算sg值时便不会再进行遍历这些点;对于后者,除了悬挂点和多边形内与悬挂点相邻的一点(相邻点中只取一个)外,多边形内其他点vis为1,这样就相当于将环化为了1条边。另外,题目当中会有重边,根据题意,当出现这种情况时,一定也是出现在树枝的末端。这里直接当作多边形来处理,方法是相同的,如果有偶数条边,化为1个点,奇数条边化为1条边。

然后由Colon Principle,可以计算出整棵树的sg值,之后对于所有的树,就是个Nim游戏了。

更多细节看代码

 #include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
#define maxn 105
#define maxp 2000
using namespace std;
int map[maxn][maxn];
bool vis[maxn];
struct node
{
int v, next;
}edge[maxp];
int num_edge, head[maxn];
void init()
{
num_edge = ;
memset(head, -, sizeof(head));
}
void addedge(int a,int b)
{
edge[num_edge].v = b;
edge[num_edge].next = head[a];
head[a] = num_edge++;
}
struct scc
{
int dfn[maxn], low[maxn];
int cnt, scnt;
bool instack[maxn];
stack<int> s;
void init()
{
cnt = scnt = ;
memset(dfn, -, sizeof(dfn));
memset(instack, , sizeof(instack));
}
void tarjan(int u,int father)
{
dfn[u] = low[u] = ++cnt;
s.push(u);
instack[u] = ;
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].v;
if (v == father)
{
if (map[u][v] > && map[u][v] % == )
vis[u] = ;
continue;
}
if (dfn[v] == -)
{
tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else if (instack[v]) low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u])
{
scnt = ;
int last;
for (;;)
{
int temv = s.top();
s.pop();
scnt++;
instack[temv] = ;
if ((temv == u) || s.empty())
break;
vis[temv] = ;
last = temv;
}
if (scnt & )
vis[last] = ;
}
return;
}
void solve(int n)
{
init();
for (int i = ; i <= n; i++) if (dfn[i] == -)
tarjan(i, -);
}
};
int getsg(int u,int father)
{
int osum = ;
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].v;
if (!vis[v] && v != father)
osum ^= ( + getsg(v, u));
}
return osum;
}
int main()
{
int k, n, m;
scc g;
while (~scanf("%d", &n))
{
int osum = ;
for (int i = ; i <= n; i++)
{
scanf("%d%d", &m, &k);
int a, b;
init();
memset(map, , sizeof(map));
memset(vis, , sizeof(vis));
while (k--)
{
scanf("%d%d", &a, &b);
addedge(a, b);
map[a][b]++;
addedge(b, a);
map[b][a]++;
}
g.solve(m);
osum ^= getsg(, -);
}
if (osum) printf("Sally\n");
else printf("Harry\n");
}
return ;
}

POJ 3710 Christmas Game [博弈]的更多相关文章

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

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

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

    Christmas Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1967   Accepted: 613 Des ...

  3. poj 3710 Christmas Game 博弈论

    思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ...

  4. POJ 3710 Christmas Game

    知识储备: 解决办法(奇偶去环):   (1) 对于长度为奇数的环,去掉其中任意一个边之后,剩下的 两个链长度同奇偶,抑或之后的 SG 值不可能为奇数,所 以它的 SG 值为 1: (2) 对于长度为 ...

  5. POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)

    题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...

  6. poj 3710 Christmas Game【博弈论+SG】

    也就是转换到树形删边游戏,详见 https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html #include<iostream> ...

  7. POJ 3710 无向图简单环树上删边

    结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...

  8. Solution -「POJ 3710」Christmas Game

    \(\mathcal{Decription}\)   Link.   定义一棵圣诞树: 是仙人掌. 不存在两个同一环上的点,度数均 \(\ge 3\).   给出 \(n\) 棵互不相关的圣诞树,双人 ...

  9. poj 2975 Nim(博弈)

    Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5232   Accepted: 2444 Description N ...

随机推荐

  1. jni 调用

    Event 0 on null Unexpected event 0 on /storage/emulated/0/Books/null

  2. Asp.net自定义控件开发任我行(6)-嵌入资源下

    摘要 上一章,我们讲了嵌入.css文件,这一章,我们来讲一下嵌入.js文件,也顺带一个嵌入Image文件 内容 我们前面的几章,一运行,下拉框就显示出来了,但是DropDwonList的下拉框是被隐藏 ...

  3. CentOS 7 编译安装最新版git

    安装wget yum install wget -y 下载最新版本的git源码,并解压 cd /usr/local/src/ wget https://mirrors.edge.kernel.org/ ...

  4. Leetcode 517.超级洗衣机

    超级洗衣机 假设有 n 台超级洗衣机放在同一排上.开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的. 在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将每台洗衣机 ...

  5. RNQOJ 开心的金明

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行”.今 ...

  6. CentOS 6.4下编译安装MySQL 5.6.14 (转)

    CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm ...

  7. Java实现简单的socket通信

    今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有pa ...

  8. Unity3D 绘制扇形/环形

    using UnityEngine; using System.Collections; using System.Collections.Generic; public class Cone : M ...

  9. vNS12 MySQL Performance

    vNS12 MySQL Performance vNS12(192.168.195.91): 2vCPU + 2GBMemMySQL1(192.168.185.73): 2vCPU + 1GBMemM ...

  10. 挖煤(coal)

    挖煤(coal) solution 我好弱,啥也想不到. 想了很久dp,这有后效性啊. 结果倒着做就可以了,因为后面的不会影响前面的. 考虑前面的影响后面:挖煤相当于让后面所有a[I]*(1+k%) ...