📜  门| GATE CS 2020 |问题 8(1)

📅  最后修改于: 2023-12-03 15:42:12.477000             🧑  作者: Mango

门| GATE CS 2020 |问题 8

此问题来自于GATE 2020计算机科学考试,是一道有趣的编程问题。对于程序员来说,这是一道很好的练习题,可以提高编程能力。

问题描述

二维平面上有n个点。假设它们分别被编了$1,2,3,...,n$。如图所示,绿色的边代表围栏,黑色的边代表门。

Problem Image

现在你需要写一个程序来判断门是否连通,并返回连通的门的编号。门之间连通的意思是:门$x$和门$y$之间存在一条路径,这个路径只经过其他的门。

输入

有两行输入,第一行是一个正整数$n$ $(3≤n≤1000)$,表示有$n$个点。接下来的一行包含$2n$个整数,第$i$个和第$i+1$个整数表示第$i/2$个点的坐标$(1\leq|x_i|,|y_i|\leq 10^6)$ $(i时为偶数)$。绝对值坐标的差不会超过$10^3$。

接下来一行是一个数组$g[i][i+1]$表示两个点之间是否有一面墙。

输出

假设连通的门有$m$个,它们的编号为$a_1,a_2,a_3,...,a_m$。将它们以升序方式排列并在一行中输出。

样例

输入:

5
1 1 1 4 4 4 4 1 2 2 3 3 2 3
1 2 0 3 4 0 5 2 6 3

输出:

2 3 6
解题思路

该问题提供的输入信息给出了:点的坐标和两点之间是否有墙。因此可以将点之间的可达性建模成一个图问题。门之间只能经过其他的门,这意味着门之间的两点之间如果没有可达路径,则可以在这两个门之间建造一道新的墙。因此我们需要将输入信息转换为一个图,并删除不必要的墙。

算法流程如下:

  1. 先将门两两之间进行连通性分析。
  2. 在所有连通的状态下,维护一个门的集合。
  3. 对于一个集合中的两个门,计算它们之间的最短路径和经过的墙的数量。
  4. 如果最短路径的距离为$0$,则删除这面墙,将两个集合合并。
  5. 重复3和4的步骤,直到没有可合并的门集合。

有了步骤4中的墙很容易推导:通过门之间所连的墙数以及墙之间的位置等来确定。

代码实现如下所示(使用Python语言):

TODO(代码片段按照Markdown格式给出)