「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的更多相关文章

  1. 「JSOI2013」贪心的导游

    「JSOI2013」贪心的导游 传送门 多次询问区间内%一个数的最大值 我们不妨设这个数为M_sea 值域比较小所以考虑分块维护. 我们观察到对于给定的一个 \(p\) ,函数 \(y = x \% ...

  2. 「JSOI2013」哈利波特和死亡圣器

    「JSOI2013」哈利波特和死亡圣器 传送门 首先二分,这没什么好说的. 然后就成了一个恒成立问题,就是说我们需要满足最坏情况下的需求. 那么显然在最坏情况下伏地魔是不会走回头路的 因为这显然是白给 ...

  3. 「JSOI2013」游戏中的学问

    「JSOI2013」游戏中的学问 传送门 考虑 \(\text{DP}\) 设 \(dp_{i, j}\) 表示将前 \(i\) 个人分成 \(j\) 个集合,并且第 \(i\) 个人在第 \(j\) ...

  4. 「JSOI2013」旅行时的困惑

    「JSOI2013」旅行时的困惑 传送门 由于我们的图不仅是一个 \(\text{DAG}\) 而且在形态上还是一棵树,也就是说我们为了实现节点之间互相可达,就必须把每条边都覆盖一次,因为两个点之间的 ...

  5. Loj #3102. 「JSOI2019」神经网络

    Loj #3102. 「JSOI2019」神经网络 题目背景 火星探险队发现,火星人的思维方式与人类非常不同,是因为他们拥有与人类很不一样的神经网络结构.为了更好地理解火星人的行为模式,JYY 对小镇 ...

  6. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  7. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  8. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  9. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

随机推荐

  1. Dockerfile深度剖析

    Dockerfile主要是用来定制镜像   Dockerfile指令集 FROM ###指定基础镜像第一条指令.scratch是虚拟的镜像,表示一个空白的镜像. FROM centos:7.5 MAI ...

  2. mysql数据库事务的操作与理解

    --------------------事务----------------------------------------------查询mysql事务隔离级别1.查看当前会话隔离级别select ...

  3. vue mvvm原理与简单实现 -- 上篇

    Object.defineProperty介绍-- let obj = {}; Object.defineProperty(obj,'school',{ configurable : true, // ...

  4. 第三十二篇 玩转数据结构——AVL树(AVL Tree)

          1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...

  5. 调用原生硬件 Api 实现照相机 拍照和相册选择 以及拍照上传

    一.Flutter image_picker 实现相机拍照和相册选择   https://pub.dev/packages/image_picker   二.Flutter 上传图片到服务器   ht ...

  6. Codeforces Round #619 (Div. 2)D(模拟)

    先把一种最长路线记录下来,根据k的大小存到ans中相应的答案再输出 #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using n ...

  7. D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )

    D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...

  8. party lamps(dfs优化+规律枚举)

    Problem description: To brighten up the gala dinner of the IOI'98 we have a set of N coloured lamps ...

  9. Bugku-CTF加密篇之进制转换(二进制、八进制、十进制、十六进制,你能分的清吗?)

    进制转换 二进制.八进制.十进制.十六进制,你能分的清吗?

  10. Bugku-CTF之前女友(SKCTF)

    Day35    前女友(SKCTF) http://123.206.31.85:49162/ flag格式:SKCTF{xxxxxxxxxxxxxxxxxx}