Submission #880832

#TimeUsernameProblemLanguageResultExecution timeMemory
880832vjudge1Love Polygon (BOI18_polygon)C++17
46 / 100
691 ms13568 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; const int N = 1e5 + 10; int n, t, cnt, ans; bool mark[N]; vector<int> G[N]; unordered_map<string, int> mp; void dfs(int v) { mark[v] = true; cnt++; int u = G[v][0]; while (!mark[u]) cnt++, mark[u] = true, u = G[u][0]; return; } void solve() { bool a[21][21] = {}; int dp[(1 << n) + 10]; memset(dp, 63, sizeof dp); for (int i = 0; i < n; i++) { string u, v; cin >> u >> v; if (mp[u] == 0) mp[u] = ++t; if (mp[v] == 0) mp[v] = ++t; a[mp[u]][mp[v]] = true; } dp[0] = 0; for (int mask = 1; mask < (1 << n); mask++) for (int lg = 0; lg < n; lg++) if (mask & (1 << lg)) for (int lg1 = 0; lg1 < n; lg1++) if (mask & (1 << lg1) && lg1 ^ lg) dp[mask] = min(dp[mask], dp[mask ^ (1 << lg) ^ (1 << lg1)] - a[lg + 1][lg1 + 1] - a[lg1 + 1][lg + 1] + 2); cout << dp[(1 << n) - 1] << '\n'; } int main() { ios:: sync_with_stdio(0), cin.tie(0); cin >> n; if (n & 1) return cout << "-1\n", 0; if (n <= 20) { solve(); return 0; } for (int i = 0; i < n; i++) { string u, v; cin >> u >> v; if (mp[u] == 0) mp[u] = ++t; if (mp[v] == 0) mp[v] = ++t; G[mp[u]].pb(mp[v]); } for (int i = 1; i <= n; i++) if (!mark[i]) { dfs(i); if (cnt ^ 2) ans += (cnt + 1) / 2; cnt = 0; } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...