import sys
from functools import lru_cache
input = sys.stdin.readline
def inp():
return(int(input()))
def inlt():
return(list(map(int,input().split())))
def insr():
s = input()
return(list(s[:len(s) - 1]))
def invr():
return(map(int,input().split()))
def bit_length(i):
s = bin(i) s = s.lstrip('-0b') return len(s)
def main():
m = inp()
lis = []
for _ in range(m):
lis.append(input().split())
edge = [[0] * m for _ in range(m)]
for i in range(m):
for j in range(i + 1, m):
if lis[i][0] == lis[j][0] or lis[i][1] == lis[j][1]:
edge[i][j] = 1
edge[j][i] = 1
@lru_cache(None)
def dfs(mask, last = -1):
tmp = 0
for i in range(m):
if last == -1:
tmp = max(tmp, dfs(mask | (1 << i), i))
elif mask & (1 << i) == 0 and edge[last][i] == 1:
tmp = max(tmp, dfs(mask | (1 << i), i))
return tmp if tmp != 0 else bin(mask).count('1')
print(m - dfs(0))
if __name__ == "__main__":
n = inp()
for i in range(n):
main()
1006A - Adjacent Replacements | 1195C - Basketball Exercise |
1206A - Choose Two Numbers | 1438B - Valerii Against Everyone |
822A - I'm bored with life | 9A - Die Roll |
1430B - Barrels | 279B - Books |
1374B - Multiply by 2 divide by 6 | 1093B - Letters Rearranging |
1213C - Book Reading | 1468C - Berpizza |
1546B - AquaMoon and Stolen String | 1353C - Board Moves |
902A - Visiting a Friend | 299B - Ksusha the Squirrel |
1647D - Madoka and the Best School in Russia | 1208A - XORinacci |
1539B - Love Song | 22B - Bargaining Table |
1490B - Balanced Remainders | 264A - Escape from Stones |
1506A - Strange Table | 456A - Laptops |
855B - Marvolo Gaunt's Ring | 1454A - Special Permutation |
1359A - Berland Poker | 459A - Pashmak and Garden |
1327B - Princesses and Princes | 1450F - The Struggling Contestant |