Codeforces936B. Sleepy Game
还好这场没打 MD什么破题
n<=100000,m<=200000的图问从s点出发能否走奇数条边到一个没有出度的点。
直观的想法:做一个bfs,$f(i,0/1)$表示从$s$出发到$i$能否走奇数/偶数条边,搜出来,找一个$f(t,1)=1$ && $ chudu(t)=0$的点做终点。
如果找不到,就看能否走进一个环。
然后开始跳坑辣!(排名不分先后)
坑一:能否走进一个环,咋写?我先这样写的

mdzz,直接搜好像不靠谱。。老老实实写tarjan吧
坑二:最后构造答案,咋写?
法一:反向图再跑一次bfs,从起点开始跑,看一条边两端的点是否一个$f(i,1)=1$一个$f(j,0)=1$,能就走。然后挂了。
由于路上可能有一个偶环,为了不让人在里面死循环,我先判的一个点不经过超过两次。
然后有这个图:

你xx在玩我!
坑三:
法二:zz吧直接bfs的时候记个前驱,从终点开始往前跑,跑到起点结束。嗯好像没啥毛病。

。。。。。。。。。。。。。。。
好吧往前跑的时候记一下奇数条边还是偶数,偶数就别停了。
//#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<map>
#include<math.h>
//#include<time.h>
//#include<complex>
#include<algorithm>
using namespace std; int n,m,s;
#define maxn 200011
#define maxm 200011
struct Edge{int to,next;};
struct Graph
{
Edge edge[maxm]; int first[maxn],le; bool du[maxn];
Graph() {le=;}
void in(int x,int y) {Edge &e=edge[le]; e.to=y; e.next=first[x]; first[x]=le++; du[x]=;} bool d[maxn],b[maxn],vis[maxn]; int pd[maxn],pb[maxn];
int que[maxn],head,tail;
void sh(int s)
{
que[head=(tail=)-]=s;
d[s]=; b[s]=; vis[s]=;
while (head!=tail)
{
int now=que[head++]; if (head==maxn) head=; vis[now]=;
for (int i=first[now];i;i=edge[i].next)
{
Edge &e=edge[i];
if (d[e.to]== && b[now])
{
d[e.to]=; pd[e.to]=now;
if (!vis[e.to])
{
vis[e.to]=;
que[tail++]=e.to;
if (tail==maxn) tail=;
}
}
if (b[e.to]== && d[now])
{
b[e.to]=; pb[e.to]=now;
if (!vis[e.to])
{
vis[e.to]=;
que[tail++]=e.to;
if (tail==maxn) tail=;
}
}
}
}
} int dfn[maxn],Time,low[maxn],sta[maxn],top; bool insta[maxn];
bool dfs(int x)
{
low[x]=dfn[x]=++Time;
sta[++top]=x; insta[x]=;
for (int i=first[x];i;i=edge[i].next)
{
Edge &e=edge[i];
if (!dfn[e.to])
{
if (dfs(e.to)) return ;
low[x]=min(low[x],low[e.to]);
}
else if (insta[e.to]) low[x]=min(low[x],dfn[e.to]);
}
if (dfn[x]==low[x])
{
if (sta[top]!=x) return ;
top--; insta[x]=;
}
return ;
}
bool roll(int s) {Time=top=; return dfs(s);}
}g,fg; int ans[maxn*],lans=;
int main()
{
scanf("%d%d",&n,&m);
for (int i=,x,y;i<=n;i++)
{
scanf("%d",&x);
for (int j=;j<=x;j++) scanf("%d",&y),g.in(i,y),fg.in(y,i);
}
int s,t=;
scanf("%d",&s);
g.sh(s);
for (int i=;i<=n;i++) if (!g.du[i] && g.d[i]) {t=i; break;}
if (t)
{
puts("Win");
for (int x=t,sb=;x!=s || ((lans&)==);sb^=)
{
ans[++lans]=x;
if (sb) x=g.pb[x];
else x=g.pd[x];
}
ans[++lans]=s;
for (int i=lans;i;i--) printf("%d ",ans[i]);
}
else
{
if (g.roll(s)) puts("Draw");
else puts("Lose");
}
return ;
}
Codeforces936B. Sleepy Game的更多相关文章
- 树状数组 || 线段树 || Luogu P5200 [USACO19JAN]Sleepy Cow Sorting
题面:P5200 [USACO19JAN]Sleepy Cow Sorting 题解: 最小操作次数(记为k)即为将序列倒着找第一个P[i]>P[i+1]的下标,然后将序列分成三部分:前缀部分( ...
- Codeforces 937D - Sleepy Game
937D - Sleepy Game 思路: dfs. vis[u][0]==1表示u这个点能从s点偶数路径到达 vis[u][1]==1表示u这个点能从s点奇数路径到达 这个样就能保证dfs时每个点 ...
- Codeforces 937 D. Sleepy Game(DFS 判断环)
题目链接: Sleepy Game 题意: Petya and Vasya 在玩移动旗子的游戏, 谁不能移动就输了. Vasya在订移动计划的时候睡着了, 然后Petya 就想趁着Vasya睡着的时候 ...
- Codeforces 937.D Sleepy Game
D. Sleepy Game time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组
\(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...
- P5200 [USACO19JAN]Sleepy Cow Sorting
P5200 [USACO19JAN]Sleepy Cow Sorting 题目描述 Farmer John正在尝试将他的N头奶牛(1≤N≤10^5),方便起见编号为1…N,在她们前往牧草地吃早餐之前排 ...
- C Sleepy Kaguya
链接:https://ac.nowcoder.com/acm/contest/338/C来源:牛客网 题目描述 Houraisan☆Kaguya is the princess who lives i ...
- Sleepy与DbgHlp库学习
参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679291(v=vs.85).aspx http://msdn.micros ...
- UVa 10427 - Naughty Sleepy Boys
题目大意:从1开始往后写数字,构成一个如下的字符串 123456789101112... .求第n位的数字是多少. 找规律,按数字的位数可以构建一个类似杨辉三角的东西,求出第n位是哪个数的第几位即可. ...
随机推荐
- AJPFX总结java开发常用类(包装,数字处理集合等)(一)
一:首谈java中的包装类 Java为基本类型提供包装类,这使得任何接受对象的操作也可以用来操作基本类型,直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类.jav ...
- 【学习笔记】深入理解js原型和闭包(11)——执行上下文栈
继续上文的内容. 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境.当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境.处于活动状态的执行 ...
- JS编写自己的富文本编辑器
富文本编辑器,网上有很多功能齐全种类丰富的如百度的Ueditor,简单适用型的如WangEditor等等.在经过一番挑选后,我发现都不适用现在的项目,然后决定自己造轮子玩玩.富文本编辑器中主要涉及到J ...
- Vue踩坑第一步,安装Vue最新版本
学习vue第一步肯定是安装vue-cli,那么肯定想去搜下如何安装vue-cli呢? 网上搜到的结果大都是: npm i vue-cli -g 输入vue -V发现: 输入node -v发现: 自己明 ...
- 【Conclusion】MySQL的安装和使用
MySQL使用 因为数据库实验用到了MySQL,这里对现在已经涉及到的MySQL部分操作做一个简单的小结. 1.安装MySQL 上MySQL的官网下载对应自己OS平台的MySQL安装文件,有在线安装和 ...
- Unity c# 状态机的简单入门
状态机模式在unity中作用是非常大的,可以实现角色的移动和场景的跳转,包括一些动画的播放,在很多unity框架中也是很常见的,发散思维广阔,下面是简单的状态机的实现,有注释 using System ...
- linux centos 中目录结构的含义
文件夹的含义 文件夹路径 含义 / 所有内容的开始 /root 系统管理员目录 /bin 缺省的liunx工具,就是存储命令的目录 环境变量等等 /etc 系统的配置 配置文件的存 ...
- CPP-STL:随机数发生器random_shuffle
//--------------------------------------------------------------------------- #include <string.h& ...
- postman使用--接口的关联
前戏 在实际接口测试过程中,接口经常会有关联,比如需要取上一个接口的返回值,然后作为参数传递给下一个接口作为参数,假设我们要获取A接口返回的userid值作为B接口的请求参数 先设置环境,所有接口在一 ...
- vue.js中的表单radio,select,textarea的v-model属性的用法
只要是表单元素,其值已经不会再用value来定义了,但是placeholder还是可以用来设置默认值. section1--input:type="text" type=" ...