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位是哪个数的第几位即可. ...
随机推荐
- spring-bean(三)
配置方式:通过工厂方法配置bean,通过FactoryBean配置bean 配置形式:基于注解的方式 组件扫描 泛型依赖注入 静态工厂方法 /** * 静态工厂方法:直接调用某一个类的静态方法就可以返 ...
- java 获取ip地址
1.使用WIFI 首先设置用户权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"& ...
- MFC技术积累——基于MFC对话框类的那些事儿5
4. 菜单 4.1 弹出菜单 本节主要讲解如何在主对话框的指定区域内通过鼠标右击来弹出一个菜单选项.最终效果图如图4.1. 如图4.1鼠标只能在指定区域(图中深色区域)内右击时弹出菜单,在指定区域外点 ...
- SEO 第七章
SEO第七章 网站网址链接 路径优化 网站的网址路径分为相对路径和绝对路径 绝对路径:绝对路径是完整的路径,不仅可以在站内打开,去其他地方依然可以打开. 相对路径:不是一个完整的路径,这种路径只能在站 ...
- Python 语言规范
Python 语言规范 pychecker 对你的代码运行pychecker 定义: pychecker 是一个在Python 源代码中查找bug 的工具. 对于C 和C++这样的不那 么动态的( ...
- subprocess使用小方法
import subprocess def create_process(cmd): p = subprocess.Popen(cmd, shell=True, stdout=subp ...
- NetBeans 默认编码修改方法
如果要NetBeans用UTF-8对文件进行解码,需要修改配置文件,具体方法如下: 1. 找到你的Netbeans安装目录下的etc文件夹,如D:\Program Files\NetBeans 8.2 ...
- JAVA自定义栈
public class Stack{ int[] data; int maxSize; int top; public Stack(int maxSize) { this.maxSize=maxSi ...
- luogu P2865 路障
https://www.luogu.org/problemnew/show/P2865 看到题解好多dijkstra,作为一名钟爱于spfa的蒟蒻看不下去了. 有些spfa要跑两边,代码量要曾长好多( ...
- 在Windows上安装和配置Jenkins
一.windows上安装Jenkins 1.官网下载Jenkins安装包Jenkins.msi ,进入安装模式,选择默认配置,安装完成之后,就会默认打开浏览器 http://localhost:808 ...