#include<bits/stdc++.h>
#define newl '\n'
const int N = 1e5 + 10;
const int V = 1e7 + 10;
const long long INF = 1e18;
const long long M = 1e9 + 7;
struct Solver{
int n,id;
std::vector<bool> match;
std::vector<std::vector<int>> adj;
std::map<std::string,int> m;
std::vector<int> par,vis;
int get(std::string str){
if(m[str] == 0){
m[str] = ++id;
}
return m[str];
}
Solver() : id(0){
}
void readData(){
std::cin >> n;
adj.resize(n + 1);
par.assign(n + 1,0);
vis.assign(n + 1,0);
match.assign(n + 1,0);
for(int i = 1;i <= n;++i){
std::string su,sv;
std::cin >> su >> sv;
int u = get(su);
int v = get(sv);
par[u] = v;
adj[par[u]].emplace_back(u);
// std::cout << u << " " << v << newl;
}
}
void dfs(int u){
vis[u] = true;
for(int v : adj[u]){
if(vis[v] || v == u){
continue;
}
dfs(v);
if(!match[v] && !match[u]){
match[u] = match[v] = true;
}
}
}
void solve(){
if(n & 1){
std::cout << -1;
return;
}
for(int i = 1;i <= n;++i){
if(i == par[i]){
dfs(i);
}
}
int ans = 0;
for(int i = 1;i <= n;++i){
ans += match[i];
// std::cout << match[i] << " ";
}
ans /= 2;
for(int i = 1;i <= n;++i){
ans += !match[i];
// std::cout << match[i] << " ";
}
// for(int i = 1;i <= n;++i){
// ans -= (par[par[i]] == i && i < par[i]);
// }
std::cout << ans;
}
void main(){
readData();
solve();
}
};
int main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);std::cout.tie(nullptr);
Solver().main();
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... |