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位是哪个数的第几位即可. ...
随机推荐
- JS内置对象练习(慕课网题目)
效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的时间. 2.计算出该班级的平均分(保留整数). 同学 ...
- 【学习笔记】深入理解js原型和闭包(8)——简述【执行上下文】上
什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览器在执行console.log(a)时, ...
- 洛谷 U10206 Cx的治疗
题目背景 「Cx的故事」众所周知,Cx是一个宇宙大犇.由于Cx在空中花园失足摔下,导致他那蕴含着无穷智慧的大脑受到了严重的损伤,许多的脑神经断裂.于是,Cx的wife(有么?)决定请巴比伦最好的医师治 ...
- Android(java)学习笔记168:Activity 4 种启动模式
1. 任务栈(task stack): 任务栈 是用来记录用户操作的行为,维护一个用户体验. 一个应用程序一般都是由多个activity组成的. 任务栈(task stack)记录存放用户开启的act ...
- 如何修改站点url
1.config目录下的config_global.php 文件,修改:$_config['cookie']['cookiedomain'] = '.xxxxx.com';2.config目录下的co ...
- Python游戏-实现键盘控制功能
要想实现键盘控制作用,就需要给游戏键盘监听事件利用pygame模块的key.get_pressed()方法,来检测按键是否按下 key_press =pygame.key.get_pressed() ...
- URAL1966 Cipher Message 3
题目描述 题解: 能看出来的是,每一组数只能改最后一位,所以前$7$位动不了. 所以$KMP$跑一跑. 重点在于最后一位怎么搞. 如果$KMP$跑完了还没找到合适的位置,直接$puts("N ...
- html前端如何将一个页面表单内的数据全部传递到另一个页面?
http://blog.csdn.net/stone_tomcate/article/details/64148648?winzoom=1
- 在Windows上安装和配置Jenkins
一.windows上安装Jenkins 1.官网下载Jenkins安装包Jenkins.msi ,进入安装模式,选择默认配置,安装完成之后,就会默认打开浏览器 http://localhost:808 ...
- go语言的碎片整理:time
时间和日期是我们编程中经常用到的,本文主要介绍了Go语言内置的time包的基本用法. Go语言中导入包 单行导入 import "time" import "fmt&qu ...