题目来源:LeetCode 1791。保留原题图语义,将函数参数与返回值改为标准输入输出。
学习目标
前置知识
先阅读 6.1 图的基本概念。环境需要 Node.js、pnpm 和支持 C++17 的编译器;Make 可选,可用下方 pnpm 命令替代。
题目
一张星型无向图有 n 个顶点:存在一个中心与其余 n-1 个顶点分别相连,没有其他边。边的输入顺序和每条边的端点顺序均不固定,请输出唯一的中心编号。输入保证是合法星型图,无需检验图形是否合法。
输入格式
第一行一个整数 n;随后 n-1 行,每行两个整数 u v 表示一条无向边。
数据范围
3 <= n <= 100000,顶点编号 1..n。无自环、无重边,恰有 n-1 条边。
输入为单组有效数据,所有整数和命令按空白分隔。自动评分不包含非法编号、非法命令或违反上述限制的图,不需要额外输出输入校验提示。
输出格式
输出一个整数,表示中心顶点编号。
只向标准输出写入答案;调试信息写入标准错误。按题面规定分行,评分按空白分隔的 token 比较。
样例
样例输入
4
1 2
2 3
4 2样例输出
2三条边都包含顶点 2,其他顶点只与 2 相连,所以中心为 2。
实现任务
修改本题目录中的 student/main.cpp,完成 TODO 标记的算法。输入输出骨架可以保留,完整参考实现单独位于 solution/main.cpp。
- 找出前两条边的公共端点,并考虑该端点出现在不同位置的情况。
- 继续读取剩余输入,最后只输出中心编号。
正常、边界与错误情况
- 正常情况:按题目定义处理全部输入,输出与输入边的排列顺序无关。
- 中心编号为 1 或 n:仍按公共端点判断。
- 两条边的端点方向相反:无向边的顺序不影响结果。
- 常见错误:不能假设中心总在第一个端点位置;最小合法规模是 3,不是 2。
- 非法输入不在评分范围;不要在标准输出中添加提示词、调试标记或额外解释。
运行与评分
在本 Lab 目录执行:
make doctor
make run
make run CASE=001-sample
make score未安装 Make 时,在仓库根目录执行:
pnpm lab:doctor -- labs/chapter-06/exercise/E-06-04-star-graph-center
pnpm lab:run -- labs/chapter-06/exercise/E-06-04-star-graph-center
pnpm lab:run -- labs/chapter-06/exercise/E-06-04-star-graph-center --case 001-sample
pnpm lab:score -- labs/chapter-06/exercise/E-06-04-star-graph-center本题有 20 组测试,每组 5 分,总分 100。起始代码可以编译,但尚未实现完整算法;满分需补齐 TODO。作者检查参考解、骨架与预期输出可使用 pnpm lab:verify -- labs/chapter-06/exercise/E-06-04-star-graph-center。
正确性说明
星型图的每条边都包含中心,而不同叶子之间没有边,因此两条不同边的唯一公共端点必为中心。只使用前两条边就足够确定答案。
复杂度分析
读完输入需要 O(n) 时间,识别中心只需 O(1) 次比较;参考实现额外空间 O(1)。使用度数数组也能完成,但会增加到 O(n) 空间。
完成清单
思考与复盘
- 为什么必须保证输入是星型图?仅凭两条边能否验证整张图为星型图?
- 使用度数统计时,如何判断中心?额外存储代价是多少?