#P13695. [CEOI 2025] theseus

    ID: 13699 远端评测题 1000ms 2048MiB 尝试: 0 已通过: 0 难度: 9 上传者: 标签>2025交互题Special JudgeCEOI(中欧)通信题Ad-hoc均摊分析

[CEOI 2025] theseus

Description

当不在思考这些抽象哲学问题时,忒修斯会在闲暇时猎杀弥诺陶洛斯。但这一次,他必须先穿过一个黑暗而扭曲的迷宫。由于这并非易事,他请求阿里阿德涅为他引路。这个迷宫可以看作是一个连通的无向图,包含 nn 个节点(编号 11nn)和 mm 条边,并且有一个特殊节点 tt,弥诺陶洛斯就在这里。

忒修斯完全看不到图的全貌,但阿里阿德涅可以。两人会先商定一个策略,使他能安全到达弥诺陶洛斯所在的节点:阿里阿德涅会在 mm 条边的每一条上贴上 0011 的标签。之后,忒修斯会从某个节点 ss 进入迷宫,而阿里阿德涅事先并不知道 ss 的位置。

由于迷宫极为黑暗,任何时刻他只能看到当前所在节点的编号、相邻节点的编号以及相邻边的标签。此外,由于迷宫结构扭曲,他永远无法记住自己之前到过的节点的任何信息。

为了安全到达弥诺陶洛斯,忒修斯必须在不超过 min+C\min + C 次移动内完成,其中 min\min 是从 sstt 的最短路径上的边数,CC 是一个常数。

实现细节

你需要实现两个函数:

std::vector<int> label(int n, std::vector<std::pair<int,int>> edges, int t);
  • nn:图的节点数
  • edgesedges:长度为 mm 的数组,描述图的边
  • tt:目的节点
  • 该函数应返回一个长度为 mm 的标签数组,第 ii 个元素只能是 0011,表示第 ii 条边的标签(0i<m0 \leq i < m)。
  • 每条边必须贴上 0011,使用其他标签会导致未定义行为
  • 每个测试用例中,该函数恰好调用一次
int travel(int n, int u, std::vector<std::pair<int,int>> neighbours);
  • nn:图的节点数
  • uu:当前所在节点
  • neighboursneighbours:由若干对 (v,e)(v, e) 组成的列表,表示 uu 与节点 vv 之间有一条标签为 ee 的边
  • 该函数应返回一个相邻节点的编号,表示下一步要移动到的节点。如果返回的节点是 tt,程序会自动终止。
  • 保证该函数被调用时,uu 不会等于特殊节点 tt
  • 每次调用该函数代表在迷宫中移动一次,因此对于每个测试用例,该函数可以被调用任意多次,直到到达终点。

注意! 程序不能使用全局或静态变量在不同的 labeltravel 调用之间传递信息。任何试图绕过这一限制的行为都会导致未定义行为



Hint

示例 1

假设我们有一个包含 77 个节点和 77 条边的图(如下所示)。起点 ss 为节点 33(绿色标记),终点 tt 为节点 77(红色标记)。评测程序会首先调用:

label(7, {{1, 6}, {7, 6}, {2, 5}, {3, 2}, {3, 6}, {6, 5}, {6, 4}}, 7)

假设 label 返回 {0, 1, 1, 1, 0, 1, 0},则图形如下:

:::align{center} :::

接下来可能的 travel 调用过程如下(能得到正确结果):

调用 返回值
travel(7, 3, {{2, 1}, {6, 0}}) 22
travel(7, 2, {{5, 1}, {3, 1}}) 55
travel(7, 5, {{6, 1}, {2, 1}}) 66
travel(7, 6, {{3, 0}, {5, 1}, {1, 0}, {4, 0}, {7, 1}}) 44
travel(7, 4, {{6, 0}}) 66
travel(7, 6, {{3, 0}, {5, 1}, {1, 0}, {4, 0}, {7, 1}}) 77

当返回值为 77(即到达目的地)时,程序终止。

数据范围

  • 1n100001 \leq n \leq 10000
  • 1m500001 \leq m \leq 50000
  • C=14C = 14
  • 在调用 label 前,起点 ss 对于该测试用例是固定的。

子任务

  1. (4 分)图是一个完全图(即 1u<vn1 \leq u < v \leq n 间都有一条边)
  2. (10 分)从终点到任意节点的距离至多为 22 条边
  3. (11 分)图是一棵树
  4. (13 分)图是二分图(即可以将节点分为两个集合,同一集合内没有边)
  5. (12 分)图是梯形图(定义见下)
  6. (50 分)无额外限制

注: 梯形图由两条长度相等的平行路径(链)组成,对应位置的节点间用边相连形成梯子横档。在梯子一端有一个特殊节点——终点 tt,它连接到两条路径的两个端点,相当于一个公共父节点。保证这种图中 nn 为奇数。见下图:

:::align{center} :::


翻译由 ChatGPT-5 完成