#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |