「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. CF432D Prefixes and Suffixes

    CF432D Prefixes and Suffixes 题意 给你一个长度为n的长字符串,"完美子串"既是它的前缀也是它的后缀,求"完美子串"的个数且统计这些 ...

  2. 深度学习之numpy.poly1d()函数

    1.np.poly1d()此函数有两个参数: 参数1:为一个数组,若没有参数2,则生成一个多项式,例如: p = np.poly1d([2,3,5,7]) print(p)    ==>> ...

  3. Mybatis面试问题集锦

    1.#{}和${}的区别是什么? 答:mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值: mybatis在处理 $ { } 时,就 ...

  4. JavaScript可视化运行工具推荐

    事件循环.执行栈和任务队列可视化 这个宏任务.微任务,自带例子,也可以自己编辑,不过超过5s的例子就不行 JavaScript Visualizer Tyler Mcginnis大佬的Advanced ...

  5. Asp.net的WebForm的落后技术

    本文链接:https://bbs.csdn.net/topics/392077893 因为webform确实,企图通过在html标签中的runat="server",在iis接受请 ...

  6. AcWing 8.二维费用的背包问题

    #include<iostream> #include<algorithm> #include<cstring> using namespace std ; ; i ...

  7. beego 使用连接mysql 报错 register db Ping `default1`, Error 1049: Unknown database 'test_beego' must have one register DataBase alias named `default`

    项目移植到另一台电脑后出现以下问题,及其解决方法: package models import ( "github.com/astaxie/beego/orm" _ "g ...

  8. Hadoop中的java基本类型的序列化封装类

    Hadoop将很多Writable类归入org.apache.hadoop.io包中,在这些类中,比较重要的有Java基本类.Text.Writable集合.ObjectWritable等,重点介绍J ...

  9. MongoDB_05_更新和删除

    文档的更新和删除 更新文档的方法: db.collection.update(query,update,options) //或 db.collection.update( <query> ...

  10. c++工程编译记录

    test3.c #include <stdio.h> #include <cpptest/cpptest.h> int test(int argc,char **argv); ...