维护一个保护集合$S$,表示哪些点$A$可能胜利。

首先将所有绿点加入$S$。

$1.$对于一个不在$S$的$A$点,若它存在某个后继在$S$中,则将其加入$S$。

$2.$对于一个不在$S$的$B$点,若它所有后继都在$S$中,则将其加入$S$。

通过拓扑可以$O(n+m)$求出$S$集合,那么剩下的点$A$必败。

$1.$对于一个在$S$的$A$点,若它所有后继都不在$S$中,则将其从$S$中移除。

$2.$对于一个在$S$的$B$点,若它存在某个后继不在$S$中,则将其从$S$中移除。

同样可以通过拓扑$O(n+m)$求出最终的$S$集合。

这样会导致某些绿点不在$S$中,那么它们就失去了作为绿点的价值,将其标记为白点。

重复运行这个算法$O(n)$轮直到所有绿点都发挥了价值,此时$S$中的点$A$必胜。

时间复杂度$O(n(n+m))$。

#include<cstdio>
const int N=3010,M=30010;
int n,m,i,j,x,c[N],d[N],g[N],v[M],nxt[M],ed,q[N],vis[N],deg[N],cnt;
inline void add(int x,int y){d[v[++ed]=x]++;nxt[ed]=g[y];g[y]=ed;}
bool solve(){
int i,x,h=1,t=0;
for(i=1;i<=n;i++){
vis[i]=c[i],deg[i]=d[i];
if(vis[i])q[++t]=i;
}
while(h<=t)for(i=g[q[h++]];i;i=nxt[i])if(!vis[x=v[i]])
if(x<=m)vis[q[++t]=x]=1;
else if(!(--deg[x]))vis[q[++t]=x]=1;
for(i=h=1,t=0;i<=n;i++){
deg[i]=d[i];
if(!vis[i])q[++t]=i;
}
while(h<=t)for(i=g[q[h++]];i;i=nxt[i])if(vis[x=v[i]])
if(x>m)vis[q[++t]=x]=0;
else if(!(--deg[x]))vis[q[++t]=x]=0;
for(t=0,i=1;i<=n;i++)if(c[i]&&!vis[i])c[i]=0,t=1;
return t;
}
int main(){
scanf("%d%d",&m,&n);n+=m;
for(i=1;i<=n;i++)for(scanf("%d%d",&c[i],&j);j--;add(i,x))scanf("%d",&x);
while(solve());
for(i=1;i<=n;i++)if(vis[i])q[++cnt]=i;
for(printf("%d\n",cnt),i=1;i<=cnt;i++)printf("%d\n",q[i]);
return 0;
}

  

BZOJ2948 : [Poi2001]绿色游戏的更多相关文章

  1. [POI2001]Gra绿色游戏

    Description 绿色游戏是一种两人游戏,双方分别称Ann和Billy.游戏的内容主要是轮流在棋盘上移动一颗棋子.棋盘上的点一部分是绿色的,其余是白色的:全部从1至a+b编号.编号1至a的点属于 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 游戏行业DDoS攻击解决方案

    行业综述 根据全球游戏和全球移动互联网行业第三方分析机构Newzoo的数据显示:2017年上半年,中国以275亿美元的游戏市场收入超过美国和日本,成为全球榜首. 游戏行业的快速发展.高额的攻击利润.日 ...

  4. 阿里云:游戏行业DDoS攻击解决方案

    转自:http://www.gamelook.com.cn/2018/01/319420 根据全球游戏和全球移动互联网行业第三方分析机构Newzoo的数据显示:2017年上半年,中国以275亿美元的游 ...

  5. 病毒木马查杀实战第013篇:一个基于.NET的“敲竹杠”病毒研究

    前言 恶意程序发展至今,其功能已经从最初的单纯破坏,不断发展为隐私的窥探,信息的盗取,乃至如今非常流行的"敲竹杠"病毒,用于勒索.可见随着时代的发展,病毒的作者们往往也是想利用自己 ...

  6. MMORPG大型游戏设计与开发(攻击区域 扇形)

    距离上次发布已经有了很长一段时间,期间由于各种原因没有更新这方面的技术分享,在这里深表遗憾.在MMO或其他的游戏中,会有针对各种形状的计算,通常在攻击区域里不会很复杂,常见的为矩形.圆形.扇形.今天分 ...

  7. 网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜 ...

  8. Unity关于获取游戏对象

    我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我.我看很多人喜欢在类里面去保存GameObject对象.解决G ...

  9. 转载:[转]如何学好3D游戏引擎编程

      [转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...

随机推荐

  1. ConfigurationManager 类的使用

    一.引用 命名空间:   System.Configuration程序集:  System.Configuration(位于 System.Configuration.dll) 二.示例 1.读取.增 ...

  2. java基础应用循环的应用

    1.1 [经典面试题]: &&(短路与)与&(非短路与)的区别: 表达式1 && 表达式2 表达式1如果为false,表达式2不执行,整个表达式结果为false ...

  3. 一 time与datetime模块

    时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time())”,返回的是float类型. 格式化的时间字 ...

  4. logstash配置白名单决定去哪个index

    input { kafka { bootstrap_servers => "127.0.0.1:9092" client_id => "log" a ...

  5. WARN conf.FlumeConfiguration: Could not configure sink sink1 due to: No channel configured for sink: sink1 org.apache.flume.conf.ConfigurationException: No channel configured for sink: sink1

    1.错误如下所示,启动flume采集文件到hdfs案例的时候,出现如下所示的错误: 大概是说No channel configured for sink,所以应该是sink哪里配置出现了错误,百度了一 ...

  6. 内存栈与堆的区别C#

    C# 堆与栈 理解堆与栈对于理解.NET中的内存管理.垃圾回收.错误和异常.调试与日志有很大的帮助.垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存, ...

  7. noip2017逛公园

    题解: 之前知道正解并没有写过.. #include <bits/stdc++.h> using namespace std; #define rint register int #def ...

  8. codeforces 1037

    题解: E-trips 哎哎哎好傻逼啊 没有想到算不能的一直在想怎么算能的 太傻逼了 其实很简单 我们只需要对好友<=k的首先dfs一下给他连接着的朋友-1 然后如果小于了就递归下去 这个正确性 ...

  9. 跨域资源共享 CORS 详解(转自阮一峰博客)

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  10. 【转】git shell 命令大全

    http://www.cnblogs.com/bugs/p/3384339.html 常用命令 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 ...