Codeforces 936B Sleepy Game 综合图论题

文章目录


一般我是不会给图论题写博客的,但这题是个相当综合的思路题所以就写一下.

题意

给一张有向图,起点 s s s有一颗棋子,两人轮流移动,移动不了的一方失败.现在由于你的对手睡觉去了,所以你可以替她移动.如果棋子不会停止,则平局,问你能得到的最优结局.如果你能赢,输出一种移动情况.

题解

s s s开始搜索,每个点有两个状态 0 / 1 0/1 0/1,表示走到这个点的是我还是对手.
如果走到不能走了并且当前的状态为 1 1 1,则我赢,直接输出从 s s s到这个点的路径并结束.
如果怎么都搜不到我赢的状态,则判路上有没有环,有环输出平局,否则只能输了.
就是这样了,谢谢大家.

const int yuzu=2e5;
typedef int fuko[yuzu|10];
fuko vis[2];
vector<int> lj[yuzu|10],path;
int main() {
  int n,m,i;
  read(n),read(m);
  for (i=1;i<=n;++i) {
    for (read(m);m--;) 
      lj[i].push_back(read());
  }
  int s,win=1,cir=0;
  function<int(int,int)> dfs=[&](int u,int p) {
    vis[p][u]=-1;
    for (auto v:lj[u]) {
      if (!win) break;
      vis[!p][v]?~vis[!p][v]||++cir:dfs(v,!p);
    }
    win-=!lj[u].size()&&p;
    if (!win) path.push_back(u);
    return vis[p][u]=1;
  };
  read(s),dfs(s,0);
  if (!win) {
    puts("Win");
    reverse(path.begin(),path.end());
    for (int g:path) printf("%d ",g);
  } else {
    puts(cir?"Draw":"Lose");
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值