Submission #979843

#TimeUsernameProblemLanguageResultExecution timeMemory
979843MilosMilutinovicLove Polygon (BOI18_polygon)C++14
0 / 100
150 ms21712 KiB
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  map<string, int> mp;
  vector<int> to(n);
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    string t;
    cin >> t;
    if (!mp.count(s)) {
      mp[s] = (int) mp.size();
    }
    if (!mp.count(t)) {
      mp[t] = (int) mp.size();
    }
    to[mp[s]] = mp[t];
  }
  if (n % 2 == 1) {
    cout << -1 << '\n';
    return 0;
  }
  vector<vector<int>> ch(n);
  for (int i = 0; i < n; i++) {
    ch[to[i]].push_back(i);
  }
  vector<int> deg(n);
  for (int i = 0; i < n; i++) {
    deg[i] = (int) ch[i].size();
  }
  vector<int> que;
  for (int i = 0; i < n; i++) {
    if (deg[i] == 0) {
      que.push_back(i);
    }
  }
  for (int b = 0; b < (int) que.size(); b++) {
    int i = que[b];
    deg[to[i]]--;
    if (deg[to[i]] == 0) {
      que.push_back(to[i]);
    }
  }
  for (int i = 0; i < n; i++) {
    if (deg[i] > 0) {
      que.push_back(i);
    }
  }
  vector<vector<int>> dp(n, vector<int>(2));
  for (int b = 0; b < (int) que.size(); b++) {
    int i = que[b];
    for (int j : ch[i]) {
      if (i == j) {
        continue;
      }
      dp[i][0] += dp[j][0];
      dp[i][1] = max({dp[i][0] + dp[j][0] + 1, dp[i][1] + dp[j][1], dp[i][1] + dp[j][0], dp[i][0] + dp[j][1]});
    }
  }
  int ans = n;
  for (int i = 0; i < n; i++) {
    if (to[i] == i) {
      ans -= max(dp[i][0], dp[i][1]);
    }
  }
  cout << ans << '\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...