第一步把邻接表建出来
最终作品第一步:写出 build_adj(无向边两头各记一次)。建好之后输出阿泰有几个邻居。 (本题用 g++ -std=c++17 -O0 编译。)
第二步接上遍历
加上 BFS,把两个起点的结果拼起来输出:从阿岚出发能到几个、从北辰出发能到几个,中间用 / 隔开。 (本题用 g++ -std=c++17 -O0 编译。)
第三步接上并查集
写出 find_root(路径压缩)和 unite,把四条关系全合并进去。输出一共有几块。 (本题用 g++ -std=c++17 -O0 编译。)
第四步两种办法互相印证
遍历数出来的块数,应该和并查集数出来的完全一样。把两个结果拼起来输出(用 / 隔开):遍历数出的块数 / 并查集数出的块数。 (本题用 g++ -std=c++17 -O0 编译。)
交付两种表示加遍历加并查集
这是这条路线的最终作品。把邻接表、邻接矩阵、BFS、并查集全写出来,然后一次验完五条:邻接表里阿泰有 3 个邻居;邻接矩阵是对称的,而且 1 的个数是 8;从阿岚 BFS 能到 4 个人,从北辰只能到 1 个;并查集数出来是 2 块;阿岚和
十万个点为什么不用矩阵
n = 100000 的图,不用邻接矩阵存,是因为【0】。
补写邻接表上的 BFS
场景:实验机上 ~/work/graph/bfs.cpp 读入一张无向图和起点,要输出起点到每个点的最少步数,但 bfs 还是空的。 任务:补全 bfs:走不到的点输出 -1。make 编译(带内存检查),./bfs < sample
十万个点的连通块
场景:~/work/graph/comp.cpp 用邻接矩阵数连通块,小图没问题,可 n = 100000 时内存申请不到。 任务:把表示法换掉,让十万个点的图在 3 秒内算完。make 编译后用 sample.txt 自测。注意:chec
写并查集的合并与查询
场景:~/work/graph/uf.cpp 处理「合并」和「查询是否同一块」两种指令,unite 和 same 还没写。 任务:补全这两个函数。make 编译后用 sample.txt 自测。check 会用随机的指令序列和标准答案逐条对
无向边只记了一头
场景:~/work/graph/reach.cpp 回答「从 a 能不能走到 b」,边是无向的,可有些明明连着的它却说走不通。 任务:修好建图部分。make 编译后用 sample.txt 自测。 可操作范围:只在分给你的这台实验机上操作。