#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5 + 5;
vector<int> g[maxn];
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin >> n;
int id = 1;
map<string, int> mp;
for(int i = 1; i <= n; i++){
string s, t; cin >> s >> t;
if(!mp.count(s)) mp[s] = id++;
if(!mp.count(t)) mp[t] = id++;
int u = mp[s], v = mp[t];
g[u].push_back(v);
}
if(n & 1){
cout << -1;
return 0;
}
vector<int> deg(n + 1), c2(n + 1), vis(n + 1), f(n + 1);
for(int i = 1; i <= n; i++) if(g[i].size()) deg[g[i][0]]++;
for(int i = 1; i <= n; i++){
if(g[i].empty()) continue;
int v = g[i][0];
if(g[v].size() && g[v][0] == i && i != v) c2[i] = 1;
}
queue<int> q;
for(int i = 1; i <= n; i++) if(!deg[i]) q.push(i);
int kept = 0;
while(q.size()){
int u = q.front(); q.pop();
int v = g[u][0];
if(!vis[u]){
if(!vis[v] && !c2[v] && u != v){
vis[u] = 1; vis[v] = 1;
kept++;
}
}
deg[v]--;
if(deg[v] == 0) q.push(v);
}
for(int i = 1; i <= n; i++){
if(vis[i]) continue;
if(c2[i]){
int v = g[i][0];
vis[i] = vis[v] = 1;
kept += 2;
}else{
int cur = i, len = 0;
while(!vis[cur]){
vis[cur] = 1;
len++;
cur = g[cur][0];
}
kept += len / 2;
}
}
cout << n - kept;
}
| # | 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... |