📜  门| GATE-CS-2007 |问题11(1)

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

门 | GATE-CS-2007 | 问题11

这是一道出自 GATE-CS-2007 的计算机科学考题,题目要求求解给定图形化模型的路径长度问题。以下是该题的详细介绍和解法思路:

问题描述

假设有一个图形化模型,其中包含若干个门,用数字(1~9)来标识。只有数字相同的门之间才能够互相连接。例如,门 3 只能够连接其它的门 3,门 5 只能够连接其它的门 5。对于此模型的一组输入 $M$,要求输出所有连接的相同门(即数字相同的门)之间的最小路径长度(即连接这些门的边的数量)之和。

输入格式

输入共有两行,其中第一行包含一个正整数 $N$,表示门的总数量 $(1 \leq N \leq 100)$。第二行包含 $N$ 个整数 $M_1,M_2,\cdots,M_N$,其中 $M_i$ 表示第 $i$ 个门的数字 $(1 \leq M_i \leq 9)$。

输出格式

输出共有一行,表示连接相同门(单个数字门)之间的最小路径长度之和。

解法思路

这道题需要考虑到两个问题:如何处理原始输入数据,以及如何求解最小路径长度之和。

对于处理输入数据来说,我们可以使用一个桶来对数字相同的门进行分组,即将所有数字为 $1$ 的门放在一个桶里,将所有数字为 $2$ 的门放在另外一个桶里,以此类推。排序之后,我们可以同时处理每组相同数字的门,对于每一组,我们可以使用一个简单的图论算法——最短路径(Dijkstra 算法)来计算这一组数字为 $num$ 的门之间的最小路径长度。需要注意的是,这里使用的是加权无向图,边的权重始终为 $1$。

最后将每一组数字为 $num$ 的门之间的最小路径长度之和累加起来即可。

以下是伪代码描述:

vector<int> buckets[10];
for (int i=0; i<N; i++) {
    buckets[M[i]].push_back(i);
}
int ans = 0;
for (int num=1; num<=9; num++) {
    vector<int> nodes = buckets[num];
    // 将 nodes 中的点看做一个图 G 中的顶点
    for (int i=0; i<nodes.size(); i++) {
        // 对于 G 中的每一个顶点,运行 Dijkstra 算法
        // 求解它与其它所有顶点之间的最短路径长度
        int node = nodes[i];
        int shortestPath[N];  // 记录每个点到所有点之间的最短路径长度
        memset(shortestPath, -1, N*sizeof(int));
        shortestPath[node] = 0;
        queue<int> q;
        q.push(node);
        while (!q.empty()) {
            int x = q.front();
            q.pop();
            for (int j=0; j<N; j++) {
                if (M[j] == M[x] && x != j && shortestPath[j] == -1) {
                    // 如果 j 与 x 是同一数字的门并且未访问过 
                    shortestPath[j] = shortestPath[x] + 1;
                    q.push(j);
                }
            }
        }
        // 计算这一组数字为 num 的门之间的最小路径和
        for (int j=i+1; j<nodes.size(); j++) {
            int otherNode = nodes[j];
            if (shortestPath[otherNode] != -1) {
                ans += shortestPath[otherNode];
            }
        }
    }
}
// 输出结果
cout << ans << endl;
复杂度分析

对于每组相同数字的门都需要运行一次 Dijkstra 算法,所以时间复杂度为 $O(9\times N^2\times \log N)$。空间复杂度为 $O(N)$。虽然时间复杂度较高,但在本题规模 $N$ 较小的情况下可以通过本题。