在这个问题中,我得到一个数组,一个二进制矩阵(仅由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。
答案 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)))