CodeForces 937D 936B Sleepy Game 有向图判环,拆点,DFS
题意:
一种游戏,2个人轮流控制棋子在一块有向图上移动,每次移动一条边,不能移动的人为输,无限循环则为平局,棋子初始位置为$S$
现在有一个人可以同时控制两个玩家,问是否能使得第一个人必胜,并输出一个解,否则判断是否能平局
题解:
看到这个题首先我想到了强连通分量,但是事实证明求出强连通分量,缩点对解决问题没有什么帮助....
能写一些看似正确的算法,但其实是假算法来的..

...........
所以应该先分析策略,肯定是能赢就赢,不能赢就求平局,最后才算输
平局很好判断,有向图上,从$S$点跑一边DFS,如果起点的可达子图包含环,就能平局了,具体方法类似tarjan
其次是判断赢,简单来说就是棋子到达了一个点,路径长度为奇数(可以经过环),且这个点没有出边了
换句话说,对于每一个点,其实有2种情况,第一个情况是你到达了这个点,到起点的距离是偶数,那肯定不会是终点了
第二个情况是你到达了这个点,到起点的距离是奇数,这时候如果还没有出边,那就是答案了,保存当前这个函数堆栈里的点即可
可是,问题在于,你可以经过一个环,来使得距离变为奇数,没法简单的DFS
我们考虑,到达每个点时有两种情况,那就是距离起点的距离奇/偶,因此考虑拆点
把每个点拆开,分别代表奇点和偶点,每次加边的时候,把点一分为三
$[1,n]$偶数点,$[n+1,2*n]$ 奇数点 $[2n+1,3n]$ 原图
对于输入的边$(a,b)$,先保存原图,再连2条边,$(a,b+n),(a+n,b)$ 表示如果当前点是偶数距离,距离加一就会变成奇数,反之亦然
意义在于,这个新的图包含了将"绕一个奇数长度的环,将偶数距离变成奇数距离"这种操作
如果是奇数长度的环,在环路的尽头会连接到另外一个偶数距离,而偶数长度的环,则不连通
然后就$O(2(m+n))$的DFS即可
我试着把判环和找答案放在一个DFS里,但是不太好写,容易TLE,就分开了,判环用原图,找答案用拆点的图

#include <bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
using namespace std;
const int maxn=6e5+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
int casn,n,m,k;
int head[maxn],nume;
struct node {int to,next;} e[maxm];
void add(int a,int b) {
e[++nume]=(node) {b,head[a]};
head[a]=nume;
}
int flag=0,draw=0;
int top,ans[maxn],s,vis[maxn];
void dfs(int now) {
int cnt=0;
vis[now]=1;
ans[++top]=now;
for(int i=head[now]; i; i=e[i].next) {
int to=e[i].to;
if(flag) return;
if(!vis[to])dfs(to);
cnt++;
}
if(now>n&&cnt==0)flag=1;
if(flag==0)top--;
}
int dfs2(int now){
if(vis[now]==2) return 1;
vis[now]=2;
for(int i=head[now];i;i=e[i].next){
int to=e[i].to;
if(!vis[to]){
if(dfs2(to))return 1;
}
else if(vis[to]==2) return 1;
}
vis[now]=1;
return 0;
}
int main() {
IO;
cin>>n>>m;
rep(i,1,n) {
int a,b;
cin>>a;
while(a--) {
cin>>b;
add(i+2*n,b+2*n);
add(i,b+n);
add(i+n,b);
}
}
cin>>s;
draw=dfs2(s+2*n);
top=0;
memset(vis,0,sizeof vis);
dfs(s);
if(flag) {
cout<<"Win\n";
for(int i=1; i<=top; i++) {
cout<<(ans[i]>n? ans[i]-n:ans[i])<<' ';
}
cout<<endl;
} else if(draw) cout<<"Draw\n";
else cout<<"Lose\n";
return 0;
}
CodeForces 937D 936B Sleepy Game 有向图判环,拆点,DFS的更多相关文章
- Dwarves (有向图判环)
Dwarves 时间限制: 1 Sec 内存限制: 64 MB提交: 14 解决: 4[提交][状态][讨论版] 题目描述 Once upon a time, there arose a huge ...
- COJ 3012 LZJ的问题 (有向图判环)
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1042 试题描述: LZJ有一个问题想问问大家.他在写函数时有时候很头疼,如 ...
- HDU 3342 Legal or Not(有向图判环 拓扑排序)
Legal or Not Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 5154 Harry and Magical Computer 有向图判环
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5154 题解: 有向图判环. 1.用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访 ...
- Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)
Almost Acyclic Graph CodeForces - 915D time limit per test 1 second memory limit per test 256 megaby ...
- Codeforces 937 D. Sleepy Game(DFS 判断环)
题目链接: Sleepy Game 题意: Petya and Vasya 在玩移动旗子的游戏, 谁不能移动就输了. Vasya在订移动计划的时候睡着了, 然后Petya 就想趁着Vasya睡着的时候 ...
- POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39602 Accepted: 13 ...
- Codeforces 937D - Sleepy Game
937D - Sleepy Game 思路: dfs. vis[u][0]==1表示u这个点能从s点偶数路径到达 vis[u][1]==1表示u这个点能从s点奇数路径到达 这个样就能保证dfs时每个点 ...
- Codeforces Round #460 (Div. 2): D. Substring(DAG+DP+判环)
D. Substring time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...
随机推荐
- HTML汇总以及CSS的一些开端
一.HTML初探 1.HTML(HyperText Markup Language):超文本标记语言指的就是超跃了txt文件,能够在里面进行一些例如:就是指页面内可以包含图片.链接 .甚至音乐.程序等 ...
- mysql 用户及权限管理 小结
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...
- Lost connection to MySQL server during query,MySQL设置session,global变量及网络IO与索引
Navicat导出百万级数据时,报错:2013 - Lost connection to MySQL server during query 网上一番搜索,修改mysql如下几处配置文件即可: sel ...
- Golang入门教程(四)变量声明
Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 一.Go的语言结构 1.Go的语言基础部分由这几个部分组成 包声明 引入包 函数 变量 语句&表达式 注释 比如下面这个简单 ...
- js/java常用正则表达式及写法
不定时增加正则表达式. 其中 Js验证写法: var str = "待验证文本"; var regular = new RegExp(/^这里是正则表达式/); if (regul ...
- 跨域请求传递Cookie问题
问题描述 前后端完全分离的项目,前端使用Vue + axios,后端使用SpringMVC,容器为Tomcat. 使用CORS协议解决跨域访问数据限制的问题,但是发现客户端的Ajax请求不会自动带上服 ...
- ARM核心板_迅为4418核心板_高稳定超轻薄_研发超灵感
ARM核心板_迅为4418核心板_三星四核S5P4418处理器 4418核心板正面: 4418核心板反面:4418核心板尺寸图:详情了解:https://item.taobao.com/item.ht ...
- PHP7语法知识(三):时间与日期、表单、类与对象、正则表达式、错误异常处理、图像处理
时间与日期 一.设置时区 1.在配置文件中设置: 2.通过data_default_timezone_set函数在文件中设置: 二.获取当前时间 三.常用时间处理方法 1.格式化时间显示: 2.计算时 ...
- 【blog】Markdown的css样式推荐
参考博客 分享一款Markdown的css样式:https://www.cnblogs.com/zhangjk1993/p/5442676.html 美化Markdown输出的HTML文档:http: ...
- Excepting a "Mapping" node but got ... Ingnore "Except mapping" in project
问题 配置端口出现以下问题 问题原因: 解析失败 解决方式: 先将把application.yml 改为 application.properties, 再将端口号文件改为如下格式 解决