arrays - 最小可能数组置换问题

标签 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 .

最佳答案

如果您将“可能互换”矩阵解释为图形,那么您会发现,在每个 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)))

关于arrays - 最小可能数组置换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53907237/

相关文章:

javascript - 获取数组内对象的名称

php - 我用 PHP sqrt 进行的练习不起作用

algorithm - 你如何找到数组中的多个 ki 最小元素?

C# OR Javascript 多次排列两个数组

permutation - 为什么在并行SIMD/SSE/AVX中需要置换?

Javascript对数组进行两次排序

javascript - 如何使用 angularJs 创建具有连续数字的多维矩阵

arrays - Ruby - 将混合字符串转换为数组

c++ - Strassen-Winograd 算法

java - 找到 64 字节数组的所有排列?