题目:http://acm.hdu.edu.cn/showproblem.php?pid=1524


题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步

,如果到某一步玩家不能移动时,那么这个人就输.


分析:本题是最典型的有向无环图的博弈,利用dfs把所有顶点的SG值都计算出来,然后对每个棋子的SG值进行异或运算,如果

为0就是先手必败,否则就是先手必胜.


如果某个人移动到出度为0的顶点,那么他必败,在这里首先介绍一下什么是SG函数.


对于给定的有向无环图,定义图中每个顶点的Sprague-Grundy函数g如下:g(x) = mex{ g(y) | y是x的后继 }。

mex(x)表示最小的不属于这个集合的非负整数。例如:mex{0,1,2,4} = 3、mex{2,3,5} = 0、mex{ } = 0。


SG函数的性质:首先,所有终结点所对应的顶点,也就是出度为0的顶点,其SG值为0,因为它的后继集合是空集。然后对于一

个g(x) = 0的顶点x,它的所有后继y都满足g(y)!=0。对于一个g(x)!=0的顶点,必定存在一个后继y满足g(y)=0.


而求整个SG函数值的过程就是一个对有向无环图进行深搜过程.


#include <iostream>
#include <string.h>
#include <stdio.h>using namespace std;
const int N = 2005;int head[N];
int n,m,cnt;struct Edge
{int to;int next;
};Edge edge[N*N];
int SG[N];void Init()
{cnt = 0;memset(SG,-1,sizeof(SG));memset(head,-1,sizeof(head));
}void add(int u,int v)
{edge[cnt].to = v;edge[cnt].next = head[u];head[u] = cnt++;
}int mex(int x)
{if(SG[x] != -1) return SG[x];bool vis[N];memset(vis,0,sizeof(vis));for(int i=head[x];~i;i=edge[i].next){int v = edge[i].to;SG[v] = mex(v);vis[SG[v]] = 1;}for(int i=0;;i++)if(!vis[i]) return i;
}int main()
{while(~scanf("%d",&n)){Init();for(int i=0;i<n;i++){scanf("%d",&m);while(m--){int u;scanf("%d",&u);add(i,u);}}int k;while(~scanf("%d",&k)){if(k == 0) break;int ans = 0;while(k--){int x;scanf("%d",&x);ans ^= mex(x);}if(ans) puts("WIN");else    puts("LOSE");}}return 0;
}


HDU1524(博弈--有向无环图SG函数)相关推荐

  1. 【图论】有向无环图的拓扑排序

    1. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...

  2. 算法精解:DAG有向无环图

    DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...

  3. C#实现有向无环图(DAG)拓扑排序

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...

  4. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)

    D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...

  5. 【网络流24题】解题报告:C、最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)

    C.最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)[省选/NOI- ] 拆点最大流 [问题分析] 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决. [建模方法] 构造二分 ...

  6. 数据结构7.5_有向无环图及其应用

    一个无环的有向图称做有向无环图,简称DAG图. 检查一个有向图是否存在环要比无向图复杂. 对于无向图来说,若深度优先遍历过程中遇到回边(即指向已访问过的顶点的边),则必定存在环. 而对于有向图来说,这 ...

  7. 【数据挖掘】贝叶斯信念网络 ( 马尔科夫假设 | 结构 | 有向无环图 | 参数 | 条件概率表 | 案例分析 )

    文章目录 I . 贝叶斯信念网络 II . 马尔科夫假设 III . 贝叶斯信念网络 示例 1 IV . 贝叶斯信念网络 示例 2 V . 贝叶斯信念网络 联合概率分布计算 VI . 贝叶斯信念网络 ...

  8. 2016 湖南省省赛B题《有向无环图》

    题目链接[https://vjudge.net/problem/CSU-1804] 题意: 给出一个有向无环图,然后让你算下面的结果,count(i,j)表示i->j之间的路径条数. 题解: 根 ...

  9. 有向无环图的拓扑排序

    拓扑排序 对于一个有向无环图,我们可以这样确定一个图中顶点的顺序:  对于所有的u.v,若存在有向路径u-->v,则在最后的顶点排序中u就位于v之前.这样确定的顺序就是一个图的拓扑排序.     ...

最新文章

  1. 职称计算机证是继续教育的内容吗,豆腐网教你一分钟弄懂继续教育学时认定表及上传注意事项~...
  2. 关于 MyBatis 我总结了 10 种通用的写法
  3. python中的object是什么意思_Python object类中的特殊方法代码讲解
  4. 2017校赛 问题 F: 懒人得多动脑
  5. leetcode初级算法4.只出现一次的数字
  6. python函数应用_python 函数应用
  7. kubernetes安装部署(kubeadm方式亲测)
  8. C#图片处理之:旋转图片90度的整数倍
  9. 基于win10系统下用vs2019编译flightgear2020.4.0
  10. 仿QQ聊天软件2.0版
  11. SQL语法基础篇 —— 常用的SQL标准
  12. 测试计划、用例、测试报告、缺陷报告总结
  13. 华为路由器接学校校园网,LOS一直亮红灯解决办法。
  14. 七.OpenCv图像轮廓
  15. 计算机等级考试程序题怎么做,全国计算机二级考试编程题技巧.doc
  16. 域名被劫持应该如何处理
  17. 唐巧iOS博客好文列表
  18. MOOS程序解析记录(4)
  19. 第三方邮件、短信服务
  20. 小a和小b一起玩一个游戏,两个人一起抛掷一枚硬币,正面为H,反面为T。两个人把抛到的结果写成一个序列。如果出现HHT则小a获胜,游戏结束。如果HTT出现则小b获胜。问a获胜的概率?

热门文章

  1. Spring 核心容器类BeanDefinition
  2. 字典-字典和列表组合的应用场景
  3. android10如何设置打开方式,Android启动方式
  4. kafka技术内幕(一)
  5. Java-Calendar
  6. win7服务器远程灰色的,小编为你细说win7系统远程协助复选框是灰色的详细技巧...
  7. 安装mysql 没有快捷_快速安装mysql
  8. 剖析数据库中重要而又常被曲解的概念
  9. 解决IntelliJ IDEA报错Failed to read candidate component class: file [ ]; nested exception is org.
  10. 紧急通知!最新版CleanMyMac X月底倒计时清仓冲量!