Codeforces 937 D. Sleepy Game(DFS 判断环)
题目链接: Sleepy Game
题意:
Petya and Vasya 在玩移动旗子的游戏, 谁不能移动就输了。 Vasya在订移动计划的时候睡着了, 然后Petya 就想趁着Vasya睡着的时候同时定下策略, 如果可以赢得话输出Win 并输出路径, 如果步数在达到1e6的情况下,就认定为平局, 输出Draw,如果输的话就输出lost。
题解:
这题很容易就可以想到如果图中存在奇数长度的路径从起始点到叶子结点就是Win状态(这里还要注意绕环走的情况,比如说奇数长度的环是可以改变路径的奇偶性的),如果不存在奇数长度的路径但是存在环的话就是Draw,如果都不是就是Lost。写了以后深深地发现自己的DFS是真的挫,如何判断有向图的环@。@! DFS的时候:
res[u][0]==1表示u这个点能从s点偶数路径到达
res[u][1]==1表示u这个点能从s点奇数路径到达
如果dfs到某点发现res的值已经为1就不用再继续下去了,这样就能保证dfs时每个点最多被访问2次。那么如果存在一个点x,使得res[x][1]==1且x的出度为0,那么就是Win的方案。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5+;
int res[MAX_N][],point[MAX_N],num_s,st[MAX_N*],vis[MAX_N];
vector<int> vec[MAX_N];
int N,M,x;
void init()
{
num_s = ;
memset(st,,sizeof(st));
memset(vis,,sizeof(vis));
memset(res,,sizeof(res));
memset(point,,sizeof(point));
for(int i=; i<MAX_N; i++) vec[i].clear();
}
bool dfs(int pos,int x)
{
if(res[pos][x^] == ) return false;
res[pos][x^] = ;
st[num_s ++] = pos;
if(vec[pos].size() == && res[pos][])
{
return true;
}
for(int i=; i<vec[pos].size(); i++)
{
if(dfs(vec[pos][i],x^)) return true;
}
num_s --;
return false;
}
bool cheak(int pos)
{
vis[pos]=;
bool f=false;
for(int i=; i<vec[pos].size(); i++)
{
if(vis[vec[pos][i]]==) f=true;
else if(vis[vec[pos][i]]==) f=cheak(vec[pos][i]);
if(f) return true;
}
vis[pos] = ;
return false;
}
int main()
{
cin>>N>>M;
init();
for(int i=; i<=N; i++)
{
int num,temp;
scanf("%d",&num);
for(int j=; j<num; j++)
{
scanf("%d",&temp);
vec[i].push_back(temp);
}
}
int pos;
cin>>pos;
if(dfs(pos,))
{
cout<<"Win"<<endl;
for(int i=; i<num_s; i++)
{
printf("%d ",st[i]);
}
cout<<endl;
}
else if(cheak(pos))
cout<<"Draw"<<endl;
else
cout<<"Lose"<<endl;
}
Codeforces 937 D. Sleepy Game(DFS 判断环)的更多相关文章
- CodeForces 937D 936B Sleepy Game 有向图判环,拆点,DFS
题意: 一种游戏,2个人轮流控制棋子在一块有向图上移动,每次移动一条边,不能移动的人为输,无限循环则为平局,棋子初始位置为$S$ 现在有一个人可以同时控制两个玩家,问是否能使得第一个人必胜,并输出一个 ...
- Codeforces 711 D. Directed Roads (DFS判环)
题目链接:http://codeforces.com/problemset/problem/711/D 给你一个n个节点n条边的有向图,可以把一条边反向,现在问有多少种方式可以使这个图没有环. 每个连 ...
- Codeforces 937.D Sleepy Game
D. Sleepy Game time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- [bzoj 1064][NOI2008]假面舞会(dfs判断环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...
- 【dfs判负环】BZOJ1489: [HNOI2009]最小圈
Description 找出一个平均边权最小的圈. Solution 经典问题,二分答案判断有无负环. 但数据范围大,普通spfa会超时,于是用dfs判负环(快多了). 思路是dis设为0,枚举每个点 ...
- Floyd判断环算法总结
Floyd判断环算法 全名Floyd’s cycle detection Algorithm, 又叫龟兔赛跑算法(Floyd's Tortoise and Hare),常用于链表.数组转化成链表的题目 ...
- HDU 2647 Reward(拓扑排序+判断环+分层)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题目大意:要给n个人发工资,告诉你m个关系,给出m行每行a b,表示b的工资小于a的工资,最低工 ...
- Atcoder Grand Contest 032C(欧拉回路,DFS判环)
#include<bits/stdc++.h>using namespace std;int vis[100007];vector<int>v[100007];vector&l ...
- 洛谷2444(Trie图上dfs判环)
要点 并没问具体方案,说明很可能不是构造. 思考不断读入这个文本串,然后中间不出现某些文法的串.啊,这就是个自动机. 将不合法串使用ac自动机构成一个Trie图,我们需要的字符串就是在这个自动机上无限 ...
随机推荐
- 铁乐学python_day20_面向对象编程2
面向对象的组合用法 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合. 例:人狗大战,人类绑定上武器来对狗进行攻击: # 定 ...
- Git忽略提交 .gitignore配置。自动生成IDE的.gitignore。解决gitignore不生效
语法 以”#”号开头表示注释: 以斜杠“/”开头表示目录: 以星号“*”通配多个字符: 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表: 以叹号“!”表示不忽略(跟踪)匹配到的文件或 ...
- Spfa(最短路求解)
spfa(最短路求解) 模板: #include<iostream> #include<cstdio> #include<queue> #include<cs ...
- Ceph块存储介绍
1. 块存储是什么 块存储简称RBD(RADOS Block Device),是一种有序的字节序块,也是在Ceph三大存储类型中最为常用的存储方式 ,Ceph的块存储是基于RADOS的,因此它也借助R ...
- HashMap,LinkedHashMap和Hashtable类的深入剖析与理解
上一篇文章写了一些关于HashMap以及HashMap的线程安全问题,这篇文章再来说说Map系列中HashMap,LinkedHashMap和Hashtable三者之间的差异以及该注意的地方. Has ...
- CentOs7.2编译安装Nginx服务器
1. 安装nginx依赖 首先安装nginx的依赖 yum install gcc gcc-c++ openssl openssl-devel cyrus-sasl-md5 2,创建nginx用户 如 ...
- 3282. Tree【LCT】
Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和 ...
- virtualbox+vagrant学习-4-Vagrantfile-5-Machine Settings
Machine Settings 配置命名空间:config.vm config.vm的设置将修改vagrant管理的机器的配置 Available Settings可用设置 config.vm.ba ...
- JAVA开发微信支付-公众号支付/微信浏览器支付(JSAPI)
写这篇文章的目的有2个,一是自己的项目刚开发完微信支付功能,趁热回个炉温习一下,二也是帮助像我这样对微信支付不熟悉,反复看了多天文档还是一知半解,原理都没摸清,更不要说实现了.本以为网上的微信开发教程 ...
- P2196 挖地雷
题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处 ...