程序在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