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位是哪个数的第几位即可. ...
随机推荐
- JVM初探
### JVM分为类的加载生命周期和gc垃圾回收两个大的方面#####首先是类的生命周期, 类的加载: --> 记载字节码 ---> 这个过程有类的加载起参与,双亲委托机制() --> ...
- Git之远程项目克隆到本地配置
远程代码克隆到本地工作区,需要进行简单的配置,用于识别身份 1.git config --global user.name [设置用户名,你的github用户名] 2.git config -- ...
- 各个浏览器CSS中的Bugs及解决方案
Bugs及解决方案列表(以下实例默认运行环境都为Standard mode): 如何在IE6及更早浏览器中定义小高度的容器? 方法: #test{overflow:hidden;height:1px; ...
- 在idea启动tomcat出现The JAVA_HOME environment variable is not defined correctly的解决
情况:某套代码是用jdk 1.6编译,然后电脑的JAVA_HOME系统变量配的是jdk1.7的,在tomcat启动时报错 The JAVA_HOME environment variable is n ...
- Git使用简析
推送本地操作 初始化一个本地Git仓库,在需要添加版本控制的文件夹根目录中使用git init命令. 添加文件到本地Git仓库: git add 文件名 # 添加文件到暂存区 git add . # ...
- 【HEVC帧间预测论文】P1.2 An Efficient Inter Mode Decision Approach for H.264 Video Codin
参考:An Efficient Inter Mode Decision Approach for H.264 Video Coding <HEVC标准介绍.HEVC帧间预测论文笔记>系列博 ...
- sql格式化工具
桌面版: SQLInform: http://www.sqlinform.com/download_free_desktop_sw.html 在线格式化: http://www.dpriver.com ...
- 解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号
解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号 在设置中把"vetur.format.defaultFormatter.js": " ...
- Asp.Net Core 入门(三) —— 自定义中间件
上一篇我们讲了Startup文件,其中着重介绍了中间件,现在我们就来自定义我们自己的中间件吧. 中间件通常封装在一个类中,并使用扩展方法进行暴露.它需要拥有一个类型为RequestDelegate的成 ...
- 使用SpringBoot-JPA进行自定义的保存及批量保存
更多精彩博文,欢迎访问我的个人博客 说明 SpringBoot版本:2.1.4.RELEASE java版本:1.8 文中所说JPA皆指spring-boot-starter-data-jpa 使用J ...