P11597 [NOISG 2018 Finals] City Mapping【缺样例】

题目背景

译自 [NOISG 2018 Finals D. City Mapping](https://github.com/noisg/sg_noi_archive/tree/master/2018/tasks/citymapping)。 ---------------- 当你在洛谷提交本题时,需要注意: - 本题仅支持 C++ 系列语言。 - 你的代码中不应该包含头文件 `citymapping.h`。 - 你的代码中应当有如下两行函数声明: ```cpp long long get_distance(int X, int Y); void find_roads(int N, int Q, int A[], int B[], int W[]); ``` 如遇评测问题,请联系搬题人。

题目描述

**这是一道交互题。** Silvermill 市是一座有 $N$ 个路口和 $N-1$ 条道路的城市。其中道路的编号为 $0$ 到 $N-2$。 第 $i$ 条道路双向连接了 $(A_i,B_i)$ 两个路口,从任意方向通过这条道路都需要花费 $W_i$ 分钟。保证任意两个路口之间都能通过道路互相到达。 为了避免交通堵塞,Silvermill 市的**每个路口连接的道路不会超过 $3$ 条**。 你的任务是画出 Silvermill 市的地图,也就是找出所有 $N-1$ 条道路的 $(A_i,B_i,W_i)$。 为了达到这个目的,你可以询问市长至多 $Q$ 次从任意一个路口 $X$ 到任意一个路口 $Y$ 最少需要多少分钟。 ### 实现细节 在本题中,**你不需要,也不应该实现主函数**。 你需要实现如下函数: ```cpp void find_roads(int N, int Q, int A[], int B[], int W[]) ``` 该函数包含两个输入参数和三个输出参数,将在评测时被运行恰好一次。输入参数为 $N,Q$,分别表示路口的数量和最大询问次数;输出参数为 $A,B,W$,你需要确定城市中的 $N-1$ 条道路,按题意中的含义以数组 $A,B,W$ 的形式返回。返回道路的顺序可以是任意的,同一道路端点的顺序也可以是任意的。 注意数组的下标是从 $0$ 开始的。 你可以调用下面的函数来完成任务: ```cpp long long get_distance(int X, int Y) ``` 该函数将返回一个整数,表示从路口 $X$ 到路口 $Y$ 最少需要多少分钟。如果你调用此函数超过 $Q$ 次,或提供无效的路口编号作为参数,程序将立刻终止,你将得到 Wrong Answer 的评测状态。

输入格式

示例测试程序如下方式读入数据: 第一行三个整数 $N,Q,S$,分别表示路口的数量、最大询问次数和子任务编号。 之后是 $N-1$ 行,每行三个整数 $(A_i,B_i,W_i)$,描述一条道路。

输出格式

示例测试程序可能会产生的输出如下: - `Wrong Input Format`,意味着对示例测试程序的输入格式有误。 - `Wrong Answer: Reported list of edges differ from actual.`,意味着你确定的道路与实际情况不符。 - `Wrong Answer: get_distance() arguments out of range.`,意味着你在询问时提供了无效的路口编号作为参数。 - `Wrong Answer: Too many calls to get_distance().`,意味着你超出了最大询问次数限制。 - 包含两行信息,分别是 `Score: s%` 和 `Correct: x out of y queries used.`,意味着你获得了该测试点 $s\%$ 的分数,最大询问次数为 $y$ 次,你使用了其中的 $x$ 次。

说明/提示

### 调用示例 我们考虑如下的城市地图,展示一种可能的函数调用过程。 ![](https://cdn.luogu.com.cn/upload/image_hosting/m7bz8mwi.png) 假设此时最大询问次数 $Q=5\times 10^5$。 你的函数将这样被调用恰好一次: ```cpp find_roads(5, 500000, A, B, W); ``` 其中 $A,B,W$ 是定义在测试程序中的数组。 一种可能的交互过程如下: - `get_distance(5, 4) = 10`:`get_distance` 函数返回从路口 $5$ 到达路口 $4$ 的最少分钟数。路线 $5\to 3\to 4$ 是最短的,需要 $10$ 分钟。 - `get_distance(2, 4) = 1`:`get_distance` 函数返回了从路口 $2$ 到达路口 $4$ 的最少分钟数。直接从 $2$ 走到 $4$ 是最短的,需要 $1$ 分钟。 - `get_distance(1, 3) = 15`:`get_distance` 函数返回了从路口 $1$ 到达路口 $3$ 的最少分钟数。路线 $1\to 4\to 3$ 是最短的,需要 $15$ 分钟。 - `get_distance(1, 2) = 9`:`get_distance` 函数返回了从路口 $1$ 到达路口 $2$ 的最少分钟数。路线 $1\to 4\to 2$ 是最短的,需要 $9$ 分钟。 此时,我们假设你的 `find_roads` 函数认为自己已经掌握了足够的信息,可以推导出正确的地图,所以将 $A,B,W$ 数组分别赋值为 $A=[3,4,4,5],B=[4,1,2,3],W=[7,8,1,3]$,然后终止。 这只是一种可能的答案,因为返回道路的顺序可以是任意的,同一道路端点的顺序也可以是任意的。 ### 子任务 对于 $100\%$ 的数据,$2\le N\le1000$,$1\le A_i,B_i\le N$,$1\le W_i\le 10^9$。 | 子任务 | 得分 | $Q$ | 特殊性质及备注 | | :----------: | :----------: | :----------: | :----------: | | $1$ | $9$ | $=5\times 10^5$ | $W_i=1$ | | $2$ | $16$ | $=5\times 10^5$ | 无特殊限制 | | $3$ | $13$ | $=12000$ | 每个路口最多连接两条道路,且 $W_i=1$ | | $4$ | $19$ | $=12000$ | 每个路口最多连接两条道路 | | $5$ | $43$ | $=25000$ | 无特殊限制,但有特殊的计分规则(请参阅**计分细则**) | ### 计分细则 子任务 $5$ 适用于以下的计分规则。你的得分依赖于你实现的函数询问的次数 $q$。 - 如果 $q>25000$,你将获得 $0$ 分。 - 如果 $12000