仅支持 C++ 交互。
你不需要引入额外的头文件,但请在代码头部加入如下内容:
extern "C"
{
int getDistance(int i, int j);
int hubDistance(int N, int sub);
}
哈萨克斯坦有 座小城镇,编号从 到 ,另有不知道具体数量的若干大城市。哈萨克斯坦的这些小城镇和大城市统称为定居点。
哈萨克斯坦的所有定居点通过一个双向公路网络连接在一起。每条公路连接 个不同的定居点。每对定居点之间最多有一条直接相连的公路。对于任意一对定居点 和 ,只要经过的公路最多只能使用一次,则有一条唯一的路径从 走到 。
每个小城镇只能与另外一个定居点直接相连,而大城市与 个或者更多的定居点直接相连。
下图给出了一个由 个小城镇和 个大城市组成的网络。小城镇用圆圈表示并用整数编号,大城市用方形表示并用字母标识。

每条公路的长度都是一个正整数。两个定居点之间距离是从一个定居点走到另一个定居点所经过的所有公路长度之和的最小值。
对于大城市 , 表示离 最远的小城镇到 的距离。在所有的大城市中 值最小的大城市称为中心城市(hub)。离中心城市最远的小城镇到中心城市的距离是 ,即 是所有 的最小值。
在上例中,离大城市 最远的小城镇是城镇 ,大城市 和小城镇 之间的距离 。对于大城市 来说,(距离大城市 最远的小城镇之一是城 )。上图中唯一的中心城市是城市 ,其 ,因此上例中 是 。
删除某个中心城市后,整个网络会分成几个连通子图,如果每个子图中至多包含 个小城镇,那么这个删除的中心城市就是平衡的(balanced)。注意:计数中不含大城市, 表示不大于 的最大整数。
在上例中,大城市 是一个中心城市,如果删除 ,整个网络分成 个连通子图,这 个子图分别包含下列小城镇 和 ,没有任何一个子图包含超过 个小城镇,所以大城市 是一个平衡的中心城市。
任务
最初,整个网络的唯一信息只有小城镇的数目 。你不知道大城市的数目,也不清楚公路的网络连接情况。你获取信息的唯一方法是查询两个小镇之间的距离。
你的任务是确定:
- 在所有的子任务中:距离 。
- 子任务 到 :网络中是否存在平衡的中心城市。
你需要实现函数 hubDistance。测试程序将会在一次运行中评测多个测试点。每次运行时最多有 个测试点。对每个测试点,测试程序会调用你的函数 hubDistance 恰好一次。请确保你的函数在每次被调用时都初始化所有需要的变量。
hubDistance(N, sub)
- :小城镇的数目。
- :子任务编号(详见子任务描述部分)。
- 是 或者 时,该函数返回 或 均可。
- 大于 时,如果存在平衡的中心城市,该函数返回 ,否则返回 。
你的 hubDistance 函数可以通过调用测试程序的函数 getDistance(i, j) 而获得关于公路网络的信息。函数 getDistance(i, j) 返回小城镇 与小城镇 之间的距离。注意:如果 和 相同的话,函数的返回值将是 ,而且当参数不合法时,返回值也是 。