Cho hai danh sách A và B cùng độ dài, và danh sách cặp C cho phép hoán đổi A[i] và A[j] bất kỳ lần nào. Tối đa hóa số cặp i sao cho A[i] == B[i] sau hoán đổi.
Ví dụ: A = [5,6,7,8], B = [6,5,8,7], C = [[0,1],[2,3]] → 4 (hoán đổi 0↔1 và 2↔3).
Quy trình giải quyết (Connected Components + Greedy)
- Xây dựng đồ thị từ các cạnh trong
C. - Tìm các thành phần liên thông (connected components) bằng BFS/DFS.
- Với mỗi thành phần:
- Đếm tần suất giá trị trong
Btại các chỉ số của thành phần. - Với mỗi chỉ số
itrong thành phần, nếuA[i]có trong đếm củaB, ghép cặp và giảm đếm.
- Đếm tần suất giá trị trong
- Tổng số cặp ghép được là kết quả.
Ví dụ mã nguồn
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)) # Output: 4
Đầu vào
[5, 6, 7, 8], [6, 5, 8, 7], [[0, 1], [2, 3]]
Đầu ra
4