状压dp板子(cf div4 #937)

#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;
}

 

posted @ 2024-04-02 14:27  wockcow  阅读(22)  评论(0)    收藏  举报