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位是哪个数的第几位即可. ...
随机推荐
- Java GUI 基础组件
1.JLabel 标签 构造函数: JLabel() JLabel(String text) JLabel(String text,int align) //第二个参数设置文本的对齐方式,常 ...
- js中不容小觑的var声明
在学习vue相关课程中,有一次跟着老师敲代码,写出了如下代码: var Child = { template:`<div @click='handleClick'><slot> ...
- Linux常用终端快捷键
UNIX程序员对键盘以及快捷键的设置都遵循一个标准:"手移动最少的距离,作更多的操作." 所有的类UNIX的终端上都有一些快捷键Ctrl+n = 下,Ctrl+b = 左,Ctrl ...
- Excel数据导入SQL Server
基本有2种方案,都是无需安装Office的方案 Ole DB读取 + BulkCopy 获取Excel各个SheetName //连接串 string strConn = "Provider ...
- sublime text3前端开发插件配置以及使用(个人喜爱)
第一步下载软件接着Ctrl +~ (回车)把下面安装包管理添加到sublimeimport urllib.request,os; pf = 'Package Control.sublime-packa ...
- JavaScript 在线测试
<iframe src="http://www.it1352.com/Onlinetools/OnlineCompileCommon/17?c_height=100&r_hei ...
- Three.js模型隐藏或显示
材质属性.visible查看Three.js文档的基类Material,可以知道材质属性.visible的作用就是控制绑定该材质的模型对象是否可见,默认值是true,LineBasicMaterial ...
- ElasticSearch的常用方法
关键词 cluster 集群 shards 索引分片 replicas 索引的副本 recovery 数据重新分布 gateway 索引的持久化方式 Transport 交互 ...
- eclipse生成spring boot jar包
1.右击项目,选择Run As - Maven clean 2.右击项目,选择Run As - Maven install 3.成功后 会在项目的target文件夹下生成jar包 4.将打包好的jar ...
- zeromq编译与应用
libzmq是c++语言开发的,正式版本在这里: https://github.com/zeromq/libzmq/releases 到这篇文件发布为止,正式稳定版是4.2.2 1,按照给出的链接下载 ...