Submission #1299400

#TimeUsernameProblemLanguageResultExecution timeMemory
1299400harryleeeLove Polygon (BOI18_polygon)C++20
21 / 100
143 ms8928 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
int n, nxt[maxn + 1], vis[maxn + 1], in[maxn + 1], rep, res;
vector<vector<int>> vec;
bool in_cycle[maxn + 1], change[maxn + 1];

inline void input(){
    map<string, int> mp;
    int dem = -1;
    cin >> n;
    for (int i = 1; i <= n; ++i){
        string u, v; cin >> u >> v;
        if (mp.find(u) == mp.end()){
            mp[u] = ++dem;
        }
        if (mp.find(v) == mp.end()){
            mp[v] = ++dem;
        }
        nxt[mp[u]] = mp[v];
        in[mp[v]]++;
        // cout << mp[u] << ' ' << mp[v] << '\n';
    }
    return;
}

int main(){
//    freopen("CHUNG.INP", "r", stdin);
//    freopen("TEST2.OUT", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();
    if ((n % 2) != 0){
        cout << -1;
        return 0;
    }
    vector<int> dp((1 << n), 2e9);
    dp[0] = 0;
    for (int mask = 1; mask < (1 << n); ++mask) if ((int)__builtin_popcount(mask) % 2 == 0){
        int u = -1;
        for (int bit = n - 1; bit >= 0; --bit) if (mask & (1 << bit)){
            u = bit;
            break;
        }
        for (int v = 0; v < u; ++v) if (mask & (1 << v)){
            int cur = dp[(mask ^ (1 << u) ^ (1 << v))];
            if (nxt[u] != v) cur++;
            if (nxt[v] != u) cur++;
            dp[mask] = min(dp[mask], cur);
        }
    }

    cout << dp[(1 << n) - 1] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...