事实上,这道题并不需要拓扑排序。(当然,拓扑排序还是更快)

  • 题目分析

    首先,题目中说了,这是一个有向无环图,所以,我们可以考虑 \(\texttt{DP}\) / 记搜 / 拓扑排序 来解决这道题。

    (我的做法是记忆化搜索。

  • 雷区分析

    刚开始我用 \(f[i]\) 表示从 \(i\) 出发能够到达的点的个数,利用记忆化搜索更新状态。

    \(f[i] = f[枚举所有出边] + 1\)

    代码如下:

    #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std; const int N = 30010; int f[N];
int n, m;
int h[N], e[N], ne[N], idx; void add(int a, int b)
{
e[ ++ idx] = b, ne[idx] = h[a], h[a] = idx;
} void dfs(int u)
{
if (f[u]) return;
int s = 1; for (int i = h[u]; i; i = ne[i])
{
int j = e[i];
dfs(j);
s += f[j];
} f[u] += s;
} int main()
{
scanf("%d%d", &n, &m); for (int i = 1, x, y; i <= m; i ++ )
scanf("%d%d", &x, &y), add(x, y); for (int i = 1; i <= n; i ++ )
if (!f[i])
dfs(i); for (int i = 1; i <= n; i ++ )
printf("%d\n", f[i]); return 0;
}

然鹅,我们没有考虑到一种情况,如图:

如果按照刚才上面的做法,那么 \(5, 6\) 号节点就会被统计两次,造成结果偏大。

所以,我们需要记录一下每个出点可到点的并集,这可以用 \(bitset\) 来实现

  • \(bitset\) 用法

    1. \(bitset\) 可以实现二进制运算的 |, ^, & 等操作。
    2. \(bitset.any()\) 返回 \(bitset\) 中是否有 \(1\)
    3. \(bitset.none()\) 返回 \(bitset\) 中是否全为 \(0\)
  • \(\texttt{Code}\)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <bitset> using namespace std; const int N = 30010;
int n, m;
int h[N], e[N], ne[N], idx;
bitset<N> f[N]; void add(int a, int b)
{
e[ ++ idx] = b, ne[idx] = h[a], h[a] = idx;
} void dfs(int u)
{
if (f[u].any()) return; f[u][u] = 1;
bitset<N> s; for (int i = h[u]; i; i = ne[i])
{
int j = e[i];
dfs(j);
s |= f[j];
} f[u] |= s;
} int main()
{
scanf("%d%d", &n, &m); while (m -- )
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
} for (int i = 1; i <= n; i ++ )
if (f[i].none())
dfs(i); for (int i = 1; i <= n; i ++ )
printf("%d\n", f[i].count()); return 0;
}

[Acwing 164. 可达性统计] 题解报告的更多相关文章

  1. AcWing 164. 可达性统计

    给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能 ...

  2. AcWing P164 可达性统计 题解

    Analysis 这道题我一开始想到的是传递闭包,但是时间复杂度是n³,也开不下30000*30000的数组,所以我想到了拓扑+状态压缩(bitset),从后往前找,把能到达的点能到哪里用位运算赋到上 ...

  3. 「CH2101」可达性统计 解题报告

    CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...

  4. AcWing:164. 可达性统计(拓扑排序 + 状态压缩算法)

    给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能 ...

  5. CFEducational Codeforces Round 66题解报告

    CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...

  6. 牛客 51011 可达性统计(拓扑排序,bitset)

    牛客 51011 可达性统计(拓扑排序,bitset) 题意: 给一个 n个点,m条边的有向无环图,分别统计每个点出发能够到达的点的数量(包括自身) \(n,m\le30000\). 样例: 10 1 ...

  7. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  8. cojs 强连通图计数1-2 题解报告

    OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...

  9. cojs 二分图计数问题1-3 题解报告

    OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...

  10. 题解报告:hdu 1398 Square Coins(母函数或dp)

    Problem Description People in Silverland use square coins. Not only they have square shapes but also ...

随机推荐

  1. DHCP是什么

    DHCP 1. DHCP是什么 协议,一种应用层的网络协议,他可以动态地分配网络中的IP地址和其他网络配置的参数以及网络设备,通俗一点讲,每台设备的IP地址,子网掩码,网关等网络参数信息都是由他来完成 ...

  2. SonarQube系列-认证&授权的配置

    参考文档:https://docs.sonarqube.org/latest/instance-administration/security/ 概述 SonarQube具有许多全局安全功能: 认证和 ...

  3. Python面试题——面向对象题

    1.简述面向对象的三大特性. 封装: 封装指的是把一堆数据属性与方法数据放在一个容器中,这个容器就是对象.让对象可以通过 "." 来调用对象中的数据属性与方法属性. 继承: 继承指 ...

  4. Linux第一次周总结

    第一章  初识 Linux 1.Linux简介 Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统 ...

  5. Python 继承和子类示例:从 Person 到 Student 的演示

    继承允许我们定义一个类,该类继承另一个类的所有方法和属性.父类是被继承的类,也叫做基类.子类是从另一个类继承的类,也叫做派生类. 创建一个父类 任何类都可以成为父类,因此语法与创建任何其他类相同: 示 ...

  6. 机器学习|K邻近(K Nearest-Neighbours)

    本文从概念.原理.距离函数.K 值选择.K 值影响..优缺点.应用几方面详细讲述了 KNN 算法 K 近临(K Nearest-Neighbours) 一种简单的监督学习算法,惰性学习算法,在技术上并 ...

  7. mysql练习案例(实操)

    最近想要在回去复习mysql语句,就在网上找了一些案例练习,起初找得都是零零散散的,后面参考这篇博客做出了一个实操案例.Eric_Squirrel:mysql学生表经典案例50题. 首先是建表,我用的 ...

  8. [Python急救站课程]九九乘法表打印

    打印九九乘法表 for i in range(1, 10): for j in range(1, i + 1): print("{}*{}={:2} ".format(j, i, ...

  9. Kubernetes:kube-apiserver 之启动流程(二)

    接着 Kubernetes:kube-apiserver 之启动流程(一) 加以介绍. 1.2.2 创建 APIExtensions Server 创建完通用 APIServer 后继续创建 APIE ...

  10. postgresql 标量子查询改写的各种姿势

    同事提供一条SQL,原执行时间需要 3.6S ,反馈比较慢需要优化一下,废话不说贴SQL: 原SQL: select ((select count(1) FROM AAAAAAAAA wf join ...