luogu#P16561. [ICPC 2026 APC] Upside Down Dijkstra
[ICPC 2026 APC] Upside Down Dijkstra
题目描述
你的弟弟手中有一个包含 个点、 条边的连通无向图。顶点编号为 到 ,边编号为 到 。第 条边连接 和 ,边权为正整数 。
你的弟弟实现了 Dijkstra 算法,以查找从顶点 到所有其他顶点的最短距离。伪代码如下。数组 记录了每个顶点首次从堆中弹出的顺序。注意,虽然同一个顶点的元组可能被多次压入堆,但每个顶点恰好只会被加入 一次。
然而,你的弟弟犯了个致命错误。在代码中,堆始终弹出最大元组而不是最小元组。堆在排序元组 时,以 (距离)较大为优先级,若距离相同则 较大优先。
:::align{center}
:::
你的弟弟告知你图的结构,也就是所有的 和 对(),但没有告知边权 。他只把数组 告诉了你,希望你根据这些信息重建出边权。你的任务是,找到一组整数 (,对于所有 ),使得运行你弟弟的错误代码时得到的数组正好为 。
如果不存在这样的边权分配,请输出 impossible。否则,输出任意一组合法的边权分配。
输入格式
第一行输入两个整数 和 (;)。
接下来 行,每行两个整数 和 (;对于所有 ,)。保证图是连通的。
最后一行输入 个整数 (;对于所有 ,)。
输出格式
如果不存在与给定 相符的边权分配,输出 impossible。
否则,输出一行 个整数 ,为每条边分配的权值,满足 ,并且你弟弟错误代码运行时得到的数组正好为 。
如果有多组输出,任意一组均可。
可以证明,如果有任何实现 的正整数边权分配,则必然存在一组满足 的分配。
5 7
3 4
2 3
1 2
3 5
1 4
1 5
4 5
1 4 3 5 2
6 1 3 1 3 2 2
4 4
1 2
2 3
1 3
2 4
1 3 4 2
impossible
提示
样例输入输出 #1 说明
下图展示了样例输出中分配的边权与图结构。
:::align{center}
:::
图 C.1:分配了边权的图。这样分配后,你弟弟的错误代码运行流程如下:
- 初始时,堆为 。
- 弹出 ,顶点 首次弹出。接下来堆里有 。
- 弹出 ,顶点 被弹出。堆变为 。
- 弹出 ,顶点 被弹出。堆变为 $\{(15, 4),(10, 5),(10, 2),(6, 1),(5, 5),(3, 2),(2, 5)\}$。
- 弹出 ,顶点 被弹出。堆变为 $\{(12, 4),(12, 1),(11, 3),(10, 2),(6, 1),(5, 5),(3, 2),(2, 5)\}$。
- 弹出 ,顶点 被弹出。
结果 。
由 ChatGPT 5 翻译