最小可能的数组置换问题

时间:2018-12-23 21:17:58

标签: arrays algorithm permutation

在这个问题中,我得到一个数组,一个二进制矩阵(仅由0和1组成的矩阵),i和j值可以认为是数组元素的索引,并且如果matrix [i] [j] = = 1,那么我们可以交换a [i]和a [j],现在我要做的是使用矩阵中的所有那些以任意顺序获得最小的排列, 这是初始数组 n = 5个大小的数组在那里

4 2 1 5 3

现在给定矩阵nXn

00100

00011

10010

01101

01010

使用所有这些,我们可以得到这样的最小排列 (使用基于1的索引进行解释)

4 2 1 5 3初始

我们要做(p1 <-> p3)

我们得到1 2 4 5 3

现在我们要做(p4 <-> p5)

我们得到1 2 4 3 5

现在我们要做(p3 <-> p4)

我们得到, 1 2 3 4 5

这是我们可以使用的最低限度

我可以想到暴力破解,但这当然会超出时间限制,所以我想知道如何以更好的方式解决此问题。

更详细的信息,这是问题的链接https://www.hackerrank.com/contests/pre-placement-coding-test/challenges/smallest-permutation/problem

1 个答案:

答案 0 :(得分:2)

如果您将“可能的掉期”矩阵解释为图形,那么您会发现,在每个connected component中,您都可以按照想要的任何顺序重新排列数字。

因此解决方案是在每个组件中独立查找所有组件并对编号进行排序。

# read input
n = int(input())
p = list(map(int, input().split()))
a = [list(map(int, input().strip())) for i in range(n)]


# find components
color = [None] * n
def dfs(v, cl):
    if color[v] is not None:
        return
    color[v] = cl
    for u in range(n):
        if a[v][u]:
            dfs(u, cl)

for i in range(n):
    dfs(i, i)

# sort every component
buckets = [[] for i in range(n)]
for i in range(n):
    buckets[color[i]].append(p[i])

for bucket in buckets:
    bucket.sort(reverse=True)

# build answer
print(*(buckets[color[i]].pop() for i in range(n)))