递归 Tarjan 数出几个分量

还是那七个点,这次把 5 → 3 那条边加回来,于是图里有了环。 运行下面这段程序: #include <algorithm> #include <climits> #include <iostream>

开始练习 →

手写栈最深压了几格

一条有 100000 个点的链 0→1→2→…,用 vector 手写栈做 DFS,记下栈最多同时有几格: #include <algorithm> #include <climits> #include <i

开始练习 →

补全:low 的两种更新

还是那七个点,这次把 5 → 3 那条边加回来,于是图里有了环。 补全 tarjan 里 low 的两种更新:孩子递归回来要用孩子的 low,碰到栈里的点要用它的 dfn。输出分量个数和最大分量的大小。 (本题用 g++ -std=c++1

开始练习 →

补全:手写栈的出栈时机

一条有 100000 个点的链 0→1→2→…,用手写栈做 DFS,按「完成」的先后记下 order。补全出栈那一段,输出第一个完成的点和一共完成了几个。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

补全:十万点大环的分量

一个十万个点的大环 0→1→…→99999→0。第一遍已经用手写栈写好了。补全第二遍(在反图 rg 上收点,同样用手写栈),输出分量个数。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

补全:估一估能递归多少层

系统栈默认 8 MB,假设递归每层大约占 96 字节。补全估算:最多能递归多少层?(本题只是估算用的算术,真实的栈帧大小由编译器决定。) (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

补全:数一数光杆分量

还是那七个点,这次把 5 → 3 那条边加回来,于是图里有了环。 这里的 kosaraju 两遍都是手写栈,没有一层递归。补全统计:输出分量个数和其中只有一个点的分量有几个。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

缩完之后一定是什么

第 1 步:先给每个点标上分量编号 第 2 步:D、E、F 互相可达:同一组 第 3 步:同组的捏成一个点 第 4 步:剩下 5 组,组间没有环 点 组 A B C D E F G 0 1 2 3 3 3 4 把每个强连通分量捏成一个点之后

开始练习 →

缩点是为了解决什么

一张有环的有向图上,拓扑排序排不全、DAG 上的递推也没法填。缩点解决的正是【0】。

开始练习 →

缩完还剩几个点几条边

把上一节那张有环的图缩点:每个强连通分量捏成一个点,分量之间的边保留(去掉重边和自环)。 原图是七个点八条边。 运行下面这段程序: #include <algorithm> #include <climits> #i

开始练习 →