美文网首页
一道有向图博弈

一道有向图博弈

作者: TimeMage | 来源:发表于2017-03-30 13:40 被阅读94次

题目链接http://codeforces.com/contest/787/problem/C
简介: 如果状态图是一棵有向树的话,博弈很简单,就不讲了。但如果是个图的话就非常麻烦,会存在环,会存在平局
比如下面两图:

1.PNG 2.PNG

题解: 综上类似于记忆化搜索或者是由未知找已知的方法是不可取的。合适的方法为由已知推逆推出未知,但我们知道比败态的条件为他的后继状态都是必胜态, 当我们发现一个必胜态是不能确定也不能假定它的前继状态为必败态。
比如图3:

pic3.PNG

新学的一个办法是记录下它的出度,当他的后继状态为必胜态时度数-1, 后继状态为必败态时,他为必胜态。度数减到0了他为必败态。

代码根据他人AC的代码修改得来,增加可读性

#include<cstdio>
#define Win 1
#define Lose 2
const int MAXN = 1<<13;
int n, f[2][MAXN];
int sz[2], s[2][MAXN];
int degree[2][MAXN];
void update(int x, int pos, int v) {
    if(f[x][pos]) return;
    if(pos==0) v=Lose;
      /*本来题目定义0没有后继状态的,
        但很可能会有必败态结点倒推出0,并使0成为必胜态!!
        这道题源有2个,如果源有1个,或者用bfs就不虚
      */
    f[x][pos] = v;
    if(v==Lose) {
        for(int i=0; i<sz[!x]; ++i)
            update(!x, (pos-s[!x][i]+n)%n, Win);
    }
    else if(v==Win) {
        for(int i=0; i<sz[!x]; ++i) {
            int npos = (pos-s[!x][i]+n)%n;
            --degree[!x][npos];
            if(!degree[!x][npos]) 
                update(!x, npos, Lose);
        }
    }
}
int main() {
    scanf("%d", &n);
    for(int i=0; i<2; ++i) {
        scanf("%d", sz+i);
        for(int j=0; j<sz[i]; ++j)
            scanf("%d", s[i]+j);
        for(int j=1; j<n; ++j)
            degree[i][j] = sz[i];
    }
    update(0,0,Lose);
    update(1,0,Lose);
    for(int i=0; i<2; ++i)
        for(int j=1; j<n; ++j) {
            if(f[i][j]==Lose) printf("Lose");
            else if(f[i][j]==Win) printf("Win");
            else printf("Loop");
            if(j==n-1) putchar('\n');
            else putchar(' ');
        }
    return 0;
}

相关文章

  • 一道有向图博弈

    题目链接:http://codeforces.com/contest/787/problem/C简介: 如果状态图...

  • 一些变化

    世界逐渐在从短期博弈向长期博弈方向转变。

  • 有向图和最短路径Dijkstra、Bellman-Ford、Fl

    本篇开始讨论关于有向图的算法,无向图是特殊的有向图。内容概要: 有向图的实现 最短路径经典算法实现 有向图的实现 ...

  • Uva(11324)(The Largest Clique)

    链接:https://vjudge.net/problem/UVA-11324思路:还是一道有向图的强连通分量+缩...

  • 任务调度-DAG和Oozie基础

    本文主要内容 有向无环图 拓扑排序 Oozie 有向无环图 什么是有向无环图 有向无环图(Directed Acy...

  • LeetCode 上一行代码就能解决的智力算法题

    第一道:除数博弈 题目来源于 LeetCode 上第 1025 号问题:除数博弈。 题目解析 对于这种博弈类的题目...

  • 《算法》-图[有向图]

    有向图 简单的来说有向图就是连接带方向的图。有向图的例子在现实生活中也很多,比如在一段时间内银行间的现金流动,或者...

  • 数据结构-图

    数据结构 - 图 目录: 基本概念无向图有向图 储存结构邻接矩阵邻接表十字链表(有向图)邻接多重表(无向图) 图的...

  • 图的表示

    图的概念 无向图无向图 有向图有向图 带权图带权图 顶点:图中的元素。 边:图中的一个顶点可以与任意其他顶点建立连...

  • 数据结构--图的定义及存储结构

    一、 图的定义和术语1、 图按照无方向和有方向分为“无向图”和“有向图” 无向图是由顶点和边构成,有向图是由顶...

网友评论

      本文标题:一道有向图博弈

      本文链接:https://www.haomeiwen.com/subject/vrouottx.html