程序在Python中交换后最大化等效对的数量

假设我们有一个数字A的列表和一个长度相同的数字B的列表。我们还有一个数字C的二维列表,其中每个元素的格式为[i,j],这表明我们可以根据需要交换A [i]和A [j]多次。我们必须找到交换后A [i] = B [i]的最大对数。

因此,如果输入像A = [5,6,7,8],B = [6,5,8,7],C = [[0,1],[2,3]],则输出将为4,因为我们可以将A [0]与A [1]交换,然后将A [2]与A [3]交换。

为了解决这个问题,我们将遵循以下步骤-

  • N:= A的大小

  • graph:=通过双向附加给定边的图形。

  • 回答:= 0

  • 看到:=大小为N的列表并用False填充

  • 对于介于0到N范围内的u

    • 队列:=队列并插入u

    • 看过[u]:=真

    • 对于队列中的每个节点,请执行

    • count:=包含队列中所有i的B [i]元素计数的映射

    • 为队列中的每个我做

    • 如果看到[nei]为假,则

    • 在队列末尾插入nei

    • 看过[nei]:=真

    • 对于graph [node]中的每个nei,执行

    • count [A [i]]:= count [A [i]]-1

    • 回答:=回答+1

    • 如果count [A [i]]不为零,则

    • 如果看到[u]为零,则

    • 返回ans

    让我们看下面的实现以更好地理解-

    示例

    from collections import Counter
    class Solution:
       def solve(self, A, B, edges):
          N = len(A)
          graph = [[]
          for _ in range(N)]
             for u, v in edges:
                graph[u].append(v)
                graph[v].append(u)
          ans = 0
          seen = [False] * N
          for u in range(N):
             if not seen[u]:
                queue = [u]
                seen[u] = True
                for node in queue:
                   for nei in graph[node]:
                      if not seen[nei]:
                         queue.append(nei)
                         seen[nei] = True
                count = Counter(B[i] for i in queue)
                for i in queue:
                   if count[A[i]]:
                      count[A[i]] -= 1
                ans += 1
          return ans
    ob = Solution()A = [5, 6, 7, 8]
    B = [6, 5, 8, 7]
    C = [[0, 1],[2, 3]]
    print(ob.solve(A, B, C))

    输入项

    [5, 6, 7, 8], [6, 5, 8, 7], [[0, 1],[2, 3]]

    输出结果

    4
    猜你喜欢