「JSOI2013」侦探jyy
「JSOI2013」侦探jyy
个人感觉我写的复杂度不够优秀啊,但是好像没有别的办法了...
我们枚举每个点,考虑这个点能不能不发生。
首先我们从这个点开始,在反图上面 \(\text{BFS}\) 只要碰到已经发生的点则这个点必须发生。
然后我们再考虑是不是能满足题目要求的点都发生,那么我们就把所有之前那次 \(\text{BFS}\) 没有访问到的入度为零的点都用来在原图上 \(\text{BFS}\) ,如果还是存在一个点不能被满足则这个点也必须发生。
否则可以不发生。
复杂度好像是 \(O(nm)\) 的,但是跑不满所以还是可以过(雾
#include <cstring>
#include <cstdio>
#include <queue>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
}
const int _ = 1e3 + 5, __ = 1e5 + 5;
int tot, phead[_], rhead[_]; struct Edge { int v, nxt; } edge[__ << 1];
inline void Add_edge(int* head, int u, int v) { edge[++tot] = (Edge) { v, head[u] }, head[u] = tot; }
int n, m, k, a[_], ra[_], dgr[_], vis[_];
queue < int > Q;
inline void bfs(int x) {
memset(vis + 1, 0, sizeof (int) * n);
Q.push(x);
while (!Q.empty()) {
int u = Q.front(); Q.pop(), vis[u] = 1;
for (rg int i = rhead[u]; i; i = edge[i].nxt)
if (!vis[edge[i].v]) Q.push(edge[i].v);
}
}
inline bool check(int x) {
bfs(x);
for (rg int i = 1; i <= k; ++i) if (vis[a[i]]) return 1;
for (rg int i = 1; i <= n; ++i) if (!dgr[i] && !vis[i]) Q.push(i);
while (!Q.empty()) {
int u = Q.front(); Q.pop(), vis[u] = 1;
for (rg int i = phead[u]; i; i = edge[i].nxt)
if (!vis[edge[i].v]) Q.push(edge[i].v);
}
for (rg int i = 1; i <= k; ++i) if (!vis[a[i]]) return 1;
return 0;
}
int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n), read(m), read(k);
for (rg int u, v, i = 1; i <= m; ++i)
read(u), read(v), Add_edge(phead, u, v), Add_edge(rhead, v, u), ++dgr[v];
for (rg int i = 1; i <= k; ++i) read(a[i]), ra[a[i]] = 1;
for (rg int i = 1; i <= n; ++i) if (ra[i] || check(i)) printf("%d ", i);
return 0;
}
「JSOI2013」侦探jyy的更多相关文章
- 「JSOI2013」贪心的导游
「JSOI2013」贪心的导游 传送门 多次询问区间内%一个数的最大值 我们不妨设这个数为M_sea 值域比较小所以考虑分块维护. 我们观察到对于给定的一个 \(p\) ,函数 \(y = x \% ...
- 「JSOI2013」哈利波特和死亡圣器
「JSOI2013」哈利波特和死亡圣器 传送门 首先二分,这没什么好说的. 然后就成了一个恒成立问题,就是说我们需要满足最坏情况下的需求. 那么显然在最坏情况下伏地魔是不会走回头路的 因为这显然是白给 ...
- 「JSOI2013」游戏中的学问
「JSOI2013」游戏中的学问 传送门 考虑 \(\text{DP}\) 设 \(dp_{i, j}\) 表示将前 \(i\) 个人分成 \(j\) 个集合,并且第 \(i\) 个人在第 \(j\) ...
- 「JSOI2013」旅行时的困惑
「JSOI2013」旅行时的困惑 传送门 由于我们的图不仅是一个 \(\text{DAG}\) 而且在形态上还是一棵树,也就是说我们为了实现节点之间互相可达,就必须把每条边都覆盖一次,因为两个点之间的 ...
- Loj #3102. 「JSOI2019」神经网络
Loj #3102. 「JSOI2019」神经网络 题目背景 火星探险队发现,火星人的思维方式与人类非常不同,是因为他们拥有与人类很不一样的神经网络结构.为了更好地理解火星人的行为模式,JYY 对小镇 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
随机推荐
- NEON的vsub方法溢出
关于NEON的vsub方法的溢出,结果如下: vsub会产生溢出,根据数据bit表示规律,可知溢出结果和理论正确结果形成互补,比如249-(-7)=256 使用类vreinterpretq_s16_u ...
- wireshark抓pc上的包
简介:wirkshark是全世界最广泛的网络封包分析软件之一. 软件用途: 网络管理员:我用它检测网络问题, 网络安全工程师:我用它检查资讯安全相关问题, 开发者:我用它为新的通讯协定除错, 普通使用 ...
- Windows10安装node.js
1.下去官网下载node.js https://nodejs.org/zh-cn/download/ 2.安装,直接默认即可,安装路径也可以自己选择 3.设置环境变量 1.安装软件,若是-g,则是全局 ...
- js实现图片无缝轮播
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- thinkphp中 model(模型)的使用
首先:有三个数据表 现在用命令行建立它们的模型 php think make:model admin/Class php think make:model index/Teacher
- 前台后台$.psot交互
前台 {include file='public/header' /} <body class="login-bg"> <div class="logi ...
- js加密(四)landChina
1. url:https://www.landchina.com/default.aspx?tabid=226 2. target: 3. 简单分析 3.1 打开fiddler和chorme无痕浏览器 ...
- 如何对字符串进行码表替换转码--加密encode
# encoding:utf-8 import base64 from string import maketrans OLD_STR = "ABCDEFGHIJKLMNOPQRSTUV ...
- 7_4 素数环(UVa524)<回溯法和生成-测试法的比较>
有一个环(ring)是由n个圈圈所组成的(在这里n一定是个偶数),我们想要把1到n的自然数各放到一个圈圈中,使得相邻2个圈圈中的数的和一定是素数.下图为n=6的情形.请注意:第1个圈圈中的数一定是1. ...
- pytorch数学运算与统计属性入门(非常易懂)
pytorch数学运算与统计属性入门1.Broadcasting (维度)自动扩展,具有以下两个重要特征:(1)expand (2)without copying data重点的核心实现功能是:(1) ...