bzoj4478: [Jsoi2013]侦探jyy

Description

JSOI 的世界里一共有 N 个不同的事件( 依次由 1 到 N 编号),以及 M 条线索。
每一条线索对应一个二元组(x,y),表示事件 x 发生会导致事件 y 发生——注
意: 线索是单向的,也就是如果 y 发生了,并不代表 x 一定会发生。
线索是有传递性的, 即如果存在线索(x,y)以及(y,z), 那么 x 发生则会导致 z
发生。
同时由于世界是合理的,任意一个事件 x 一定不会通过某些线索导致事件 x
本身发生。
另外,整个世界仅包含这 M 条线索, 我们不认为一些事件会凭空发生(就
像福尔摩斯永远不会认为诡异的凶杀案是源于神的谴责)。具体而言: 对于某
个事件 x, 如果 x 发生了,并且存在某个事件可能导致 x 发生,那么一定至少有
一个可能导致 x 发生的事件发生了。
现在已知世界上的 M 条线索,以及 D 个已经发生的事件,那么由此推断,
哪些事件一定已经发生了呢?

Input

第一行包含用空格隔开的三个整数,分别为 N, M 和 D。
接下来 M 行,每行两个整数 x, y 表示线索(x,y), 满足 1 < = x, y < = N。
接下来 D 行为 D 个 1 到 N 之间不同的整数, 表示已知的已经发生的事件。
1 < = D < = N < = 1000, 1 < = M < = 100000

Output

包含一行至少 D 个由空格隔开的严格递增的正整数, 表示根据 M条线索以及 D 个已知事件
JYY 所能推断出的一定发生了的事件。

Sample Input

3 2 1
1 3
2 3
3

Sample Output

3
在第一个样例中,由于事件 1 和事件 2 这两个事件中的任何一个发生都会导
致事件 3 发生,所以我们并不能确定到底哪个事件发生了。
在第二个样例中,由于事件 4 发生了,所以事件 2 和事件 3 中至少有一个发
生了。而不论哪一个发生了,都可以推出事件 1 发生了。最终由于事件 1 发生了,
使得我们可以推断出,所有 4 个事件都必然发生了。

分析

枚举每个点,假设它不可发生,判断是否存在一种情况使得所有已知事件可以发生
可以推断这个点的所有前驱节点必然不可发生。如果说这些点中包含已知发生的事件,那么它必须发生。
剩余的入度为零的点我们可以任意选择它可以发生或者不可以发生,贪心地让他们都发生,看看已知事件可不可以发生。如果没有全部发生,那么它也必须发生。
否则它可以不发生。

代码

#include<cstdio>
#include<algorithm>
const int N = 1e3 + 10, M = 1e5 + 10;
int ri() {char ch = getchar(); int x = 0;for(;ch < '0' || ch > '9'; ch = getchar()) ;for(;ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) - '0' + ch;return x;
}
int to[M], nx[M], pr[N], q[N], Pr[N], To[M], Nx[M], Tp, tp, n, tim, in[N], a[N], ans[N], D, vis[N];
bool s[N];
void add(int u, int v) {to[++tp] = v; nx[tp] = pr[u]; pr[u] = tp; ++in[v]; }
void Add(int u, int v) {To[++Tp] = v; Nx[Tp] = Pr[u]; Pr[u] = Tp;}
void Bfs(int x) {int L = 0, R; q[R = 1] = x; vis[x] = tim;for(int u = q[++L]; L <= R; u = q[++L])for(int i = Pr[u]; i; i = Nx[i])if(vis[To[i]] != tim) vis[q[++R] = To[i]] = tim;
}
bool check(int x) {++tim; Bfs(x); for(int i = 1;i <= D; ++i) if(vis[a[i]] == tim) return true;int L = 0, R = 0; for(int i = 1;i <= n; ++i) if(!in[i] && vis[i] != tim) vis[q[++R] = i] = tim;for(int u = q[++L]; L <= R; u = q[++L])for(int i = pr[u]; i; i = nx[i])if(vis[to[i]] != tim) vis[q[++R] = to[i]] = tim;for(int i = 1;i <= D; ++i) if(vis[a[i]] != tim) return true;return false;
}
int main() {n = ri(); int m = ri(); D = ri(); for(;m--;) {int u = ri(), v = ri(); add(u, v); Add(v, u);} tp = 0;for(int i = 1; i <= D; ++i) s[a[i] = ri()] = true;for(int i = 1;i <= n; ++i) if(s[i] || check(i)) ans[++tp] = i;std::sort(ans + 1, ans + tp + 1);for(int i = 1;i <= tp; ++i) printf("%d ", ans[i]); puts("");return 0;
}


bzoj4478: [Jsoi2013]侦探jyy 图论搜索相关推荐

  1. 【题解】bzoj 4478 [Jsoi2013]侦探jyy

    原题传送门 弱智搜索题 我们就枚举每个点,先判断它是否必须发生,如果没有必须发生,开始搜索它的祖先,如果祖先中有必须发生的,那么它就必须发生,如果祖先中没有必须发生的,那么搜索所有入度为0的点(除了它 ...

  2. 【图论搜索专题】如何使用「双向 BFS」解决搜索空间爆炸问题

    题目描述 这是 LeetCode 上的 「127. 单词接龙」 ,难度为 「困难」. Tag : 「双向 BFS」 字典 wordList 中从单词 beginWord 和 endWord 的 转换序 ...

  3. 【图论 搜索】bzoj1064: [Noi2008]假面舞会

    做到最后发现还是读题比赛:不过还是很好的图论题的 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选 ...

  4. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  5. C++基础图论算法大集合 (图论,看我就行了)

    图论 搜索技术 深度优先搜索 (应用--求重心) 广度优先搜索 (应用--图中的层次遍历) 有向图的拓扑排序 最短路问题 Dijkstra算法(朴素版) Dijkstra算法 (堆优化) bellma ...

  6. 【点云论文速读】最佳点云分割分析

    点云PCL免费知识星球,点云论文速读. 标题:Learning to Optimally Segment Point Clouds 作者:Peiyun Hu, David Held 星球ID:part ...

  7. 被围绕的区域(dfs)

    原创公众号:bigsai 欢迎加入力扣打卡 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' ...

  8. 面试官:谈谈Redis缓存和MySQL数据一致性问题

    前言 对于Web来说,用户量和访问量增一定程度上推动项目技术和架构的更迭和进步.可能会有以下的一些状况: 页面并发量和访问量并不多,MySQL足以支撑自己逻辑业务的发展.那么其实可以不加缓存.最多对静 ...

  9. ACM基础知识及算法

    ACM 算法   难度 数据结构 栈 栈     1 单调栈       队列 一般队列     1 优先队列/单调队列     1 循环队列     2 双端队列     2 链表 一般链表     ...

最新文章

  1. 构造函数的初始化列表
  2. Matlab 自带机器学习算法汇总
  3. DayDayUp:博主,在此,祝愿大家(十五种编程语言输出),2019年春节快乐!猪年诸事大吉!学要有所成,劳要有所获!
  4. python并且怎么表示_Python-如何在Python中表示“Enum”?
  5. MySQL关联更新update
  6. ElasticSearch实战-入门
  7. 如何开发 Servlet 程序
  8. 三个子系统_「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)
  9. 【转载】某牛逼的文章《曝光一下我开发的游戏项目的日报周报 》
  10. cf(聚簇因子)调优,计划调优,SQL改造
  11. uniapp微信小程序获取位置(高德SDK)
  12. 卡巴斯基授权key导入方式方法及其导入key基本原理
  13. 【Minecraft】建立Bukkit/Spigot插件实时调试环境,并避免断点调试时客户端断开连接
  14. windows XP系统自动关机
  15. 静态网络爬虫之Xpath学习
  16. RST 和 Markdown
  17. 如何 重构网络 SDN架构实现
  18. PDF可以通过OCR图文识别软件转换为JPEG图像吗
  19. H5 前端模板 JS 用法
  20. R语言逻辑操作符:、|、!、||

热门文章

  1. PHP中json_encode与json_decode用法
  2. 非计算机专业可以考软考吗?
  3. 「二分类算法」提供银行精准营销解决方案 代码存档
  4. Win10问题篇:让AIDA64像鲁大师那样把温度显示在任务栏。
  5. 如何在html中加入柱状图,利用DIV+CSS做的柱状图(3)
  6. 雷军灵魂三问,财报有点打脸
  7. 电子器件系列四:锁相环
  8. 数据库应用系统功能设计与实施
  9. ARM7、ARM9和ARM11的区别
  10. Java总结 - 基础知识