较小权不完美非匹配:最小生成树往返¶
出题人解法:Kruskal 最小生成树及树边往返构造。Codex(GPT-6):迭代遍历、边界处理、完整评分器和独立检验。首选程序为 std.cpp。
构造¶
按权值排序所有边,用并查集选取最小生成树。保存每条选中边的输入编号。以1为根遍历这棵树:进入儿子前输出对应边编号,处理完该儿子后再次输出同一编号。实现使用显式栈,栈帧保存顶点、父亲、下一条待处理的树边及返回边。
自环不会连接两个不同并查集;重边作为不同候选正常参与排序。边权相同用输入编号打破平局,使参考输出可复现。
正确性¶
Kruskal 每次选取连接两个不同分量的最小权边,满足生成树的割性质,最终得到权值为 \(W\) 的最小生成树。
对每个子树归纳:进入其根后,构造沿各儿子的树边进入,再在完成儿子后沿同一边返回。因此每个子树的顶点都会被访问,且处理结束时回到该子树的根。整段行走从1出发并回到1。
每条树边恰好使用两次,所以序列长 \(2(n-1)\le5n\) ,费用 \(Y=2W=B\le2B\) ,取得满分。\(n=1\) 时输出0,同样满足要求。我们不需要证明这段路线是全图最短闭路。
复杂度与评分器¶
时间 \(O(m\log(m+1)+(n+m)\alpha(n))\) ,空间 \(O(n+m)\) .费用累计使用64位整数;栈代替递归以支持长链。
checker.py 独立使用 Prim 计算基准,检查编号、步数、路径连续性、回到1、全部顶点被访问以及多余输出。满分和部分分按整数公式计算,避免浮点向上取整误差。零基准在首个分支处理,不进行除零运算。合法部分分也返回进程状态0,得分以标准输出为准。
Prim 替换 Kruskal 仍属于同一最小生成树构造;没有为了不同容器再发布一份相同方案。任意生成树的往返虽合法,但权值可能远高于基准,不能保证满分。
验证与性能¶
正式数据各运行五次,并单独测量峰值内存。标准程序最慢中位数 0.100009 秒,峰值 15.23 MiB。按2倍向上取整至0.5秒,参考时限为 0.5 秒。