第一步:先判有没有环
七个构建任务编号 0~6,(a, b) 表示 a 做完才能做 b。 交付流程的第一步:判环。两张图各判一次。 (本题用 g++ -std=c++17 -O0 编译。)
第二步:几轮做完备几台
七个构建任务编号 0~6,(a, b) 表示 a 做完才能做 b。 第二步:算出并行要几轮,以及最宽的那一层有几个任务——那就是最多要备几台机器。 (本题用 g++ -std=c++17 -O0 编译。)
第三步:有环就缩点
还是那七个点,这次把 5 → 3 那条边加回来,于是图里有了环。 第三步:既然判出有环,就把它缩成 DAG。补全 condense,输出缩完的点数和边数。 (本题用 g++ -std=c++17 -O0 编译。)
第四步:吞吐量和它的上界
一张管道网,0 号是水源、6 号是出口,cap[u][v] 是 u→v 这根管子每秒最多能过多少水。 第四步:算出这张网的最大流,再算出水源接出去的总容量,两个一起输出。 (本题用 g++ -std=c++17 -O0 编译。)
交付:五条验收一起过
七个构建任务编号 0~6,(a, b) 表示 a 做完才能做 b。 最后一步:把五条验收条款补全,一次全部验过。每一条都落在一个唯一的数上——顺序可以不同,但这些数不能不同。 (本题用 g++ -std=c++17 -O0 编译。)
大图递归会出什么事
在实验机上对一条十万个点的链做递归 DFS,程序最可能【0】。
补写 Kahn 拓扑排序
场景:实验机上 ~/work/graph/topo.cpp 读入一张有向图,要输出编号最小优先的拓扑序;有环就输出 有环。topo 函数还空着。 任务:补全 topo。make 编译,./topo < sample.txt 自测。ch
十万点的图别爆栈
场景:~/work/graph/scc.cpp 用递归 Tarjan 求强连通分量个数和最大分量大小。小图没问题,可点一多、链一长就段错误。check 会在 1 MB 栈下运行,并限时 2 秒。 任务:把递归改成手写栈(或换成两遍都用手写栈
实现最大流
场景:~/work/graph/flow.cpp 读入一张带容量的有向图,要输出从 1 号到 n 号的最大流。maxflow 还空着。 任务:补全 maxflow(Edmonds-Karp 或 Dinic 都行)。make 编译后用 sam
修好判环的条件
场景:~/work/graph/cycle.cpp 用 Kahn 判断一张有向图有没有环,可有的无环图被判成了有环,有的有环图又被放过了。 任务:修好判环那一行。make 编译后用 sample.txt 自测;check 会用随机的有环 /