博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 937D Sleepy Game
阅读量:7263 次
发布时间:2019-06-29

本文共 2750 字,大约阅读时间需要 9 分钟。

题意:Petya and Vasya 在玩移动旗子的游戏, 谁不能移动就输了。 Vasya在订移动计划的时候睡着了, 然后Petya 就想趁着Vasya睡着的时候同时定下策略, 如果可以赢得话输出Win 并输出路径, 如果步数在达到1e6的情况下,就认定为平局, 输出Draw,如果输的话就输出lost。

题解:每个点以奇偶的步数通过就能确定是否为赢, 如果偶数步走到这个点, 那么下次再偶数走过这个点, 那么这个点上次通过的点的步数奇偶就不变了, 就不需要走了。

可以用Tarjian 缩环, 然后标记一下成环的点, 这样如果走路的时候访问到这个点, 那么就算至少也可以到达平局。

然后在走到没有路的点,然后判断一下奇偶就好了。

代码:

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 const int N = 1e6+10; 8 struct Node{ 9 int to;10 int nt;11 }e[N];12 int tot = 0;13 int head[N], vis[N], ans[N], last[N];14 int instack[N], low[N], dfn[N], vvis[N], Stack[N];15 int ccnt = 0, top = 0;16 void add_edge(int u, int v){17 e[tot].to = v;18 e[tot].nt = head[u];19 head[u] = tot++;20 }21 void Tar(int u){22 instack[u] = 1, vvis[u] = 1;23 low[u] = dfn[u] = ccnt++;24 Stack[++top] = u;25 for(int i = head[u]; ~i; i = e[i].nt){26 int v = e[i].to;27 if(!vvis[v]) Tar(v);28 if(instack[v]) low[u] = min(low[v], low[u]);29 }30 if(low[u] == dfn[u]){31 if(Stack[top] == u){32 top--;33 instack[u] = 0;34 return;35 }36 while(1){37 int v = Stack[top--];38 vvis[v] = -1;39 instack[v] = 0;40 if(v == u) break;41 }42 }43 }44 bool draw = false, win = false;45 int ans_cnt = 0;46 int max_n = 1e6;47 void dfs(int u, int cnt){48 if(win) return ;49 if(cnt >= max_n) {draw = true; return;}50 if(vis[u] == -1) return;51 if(vvis[u] == -1) draw = true;52 vis[u]++;53 ans[cnt] = u;54 if(vis[u] == 1) last[u] = cnt;55 if(vis[u] > 1 && (cnt-last[u])%2 == 0) {
return ;}56 if(vis[u] > 1 && (cnt-last[u])%2 == 1)57 {vis[u] = -1;}58 if(head[u] == -1 && cnt&1) {win = true; ans_cnt = cnt ; return;}59 for(int i = head[u]; ~i; i = e[i].nt){60 dfs(e[i].to, cnt+1);61 }62 }63 int main(){64 int n, m;65 scanf("%d%d",&n,&m);66 int t, v;67 memset(head, -1, sizeof(head));68 memset(last, -1, sizeof(last));69 for(int i = 1; i <= n; i++){70 scanf("%d",&t);71 for(int j = 1; j <= t; j++){72 scanf("%d",&v);73 add_edge(i,v);74 }75 }76 for(int i = 1; i <= n; i++)77 if(!vvis[i]) Tar(i);78 scanf("%d",&v);79 dfs(v,0);80 if(win){81 printf("Win\n");82 for(int i = 0; i <= ans_cnt; i++)83 printf("%d%c",ans[i]," \n"[i == ans_cnt]);84 }85 else if(draw)86 printf("Draw\n");87 else printf("Lose\n");88 return 0;89 }

 

转载于:https://www.cnblogs.com/MingSD/p/8495763.html

你可能感兴趣的文章
关于腾讯QQ登陆后提示“XXX.dll文件没有被指定在windows上运行”的解决方法
查看>>
Squid三种代理及配置
查看>>
php iconv
查看>>
关于微信js分享接口的一些使用心得
查看>>
scrapy初探之爬取武sir首页博客
查看>>
H3C堆叠irf
查看>>
一 Puppet学习之puppet的安装和配置
查看>>
网站推广方法
查看>>
软件开发的两个系统
查看>>
关闭SELinux的两种方法
查看>>
svn简单安装与配置
查看>>
Linux基础篇之开机流程
查看>>
linux下 oracle常用命令
查看>>
Linux 磁盘管理
查看>>
查看当前LINUX公网命令
查看>>
cisco 网络常用命令
查看>>
系统TCP连接的查询与统计各状态的连接数
查看>>
tomcat下server.xml配置调优
查看>>
mysql主主备份及集群
查看>>
mysql启动问题---pid
查看>>