#include <bits/stdc++.h> using namespace std; int n; vector<int> v[20]; string a[20], b[20]; bool dp[500010][20]; void dfs(int s, int now) { dp[s][now] = true; for(auto nxt: v[now]) { if(s & (1 << nxt)) continue; if(!dp[s | (1 << nxt)][nxt]) dfs(s | (1 << nxt), nxt); } } int main() { int t; cin >> t; while(t --) { int ans = 0; cin >> n; for(int i = 0; i < (1 << n); i ++) { for(int j = 0; j < n; j ++) dp[i][j] = false; } for(int i = 0; i < n; i ++) { cin >> a[i] >> b[i]; v[i].clear(); } for(int i = 0; i < n; i ++) { for(int j = i + 1; j < n; j ++) { if(a[i] == a[j] || b[i] == b[j]) { v[i].push_back(j); v[j].push_back(i); } } } for(int i = 0; i < n; i ++) { dp[1 << i][i] = true; dfs(1 << i, i); } for(int i = 0; i < (1 << n); i ++) { for(int j = 0; j < n; j ++) if(dp[i][j]) ans = max(ans, __builtin_popcount(i)); } cout << n - ans << endl; } return 0; }
标签:now,20,int,状压,cf,++,div4,dp From: https://www.cnblogs.com/wockcow/p/18110516