#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
int n, nxt[maxn + 1], vis[maxn + 1], in[maxn + 1], rep, res, in_cycle[maxn + 1];
vector<vector<int>> vec;
vector<int> q;
inline void input(){
map<string, int> mp;
int dem = 0;
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;
}
//
//inline void input(){
// cin >> n;
// for (int i = 1; i <= n; ++i){
// int u, v; cin >> u >> v;
// nxt[u] = v;
// in[v]++;
// }
// return;
//}
inline void get_cycle(int start){
vector<int> res;
int u = start;
while(true){
in_cycle[u] = vec.size();
res.push_back(u);
if (nxt[u] == start) break;
u = nxt[u];
}
vec.push_back(res);
// for (int x : res) cout << x << ' ';
// cout << '\n';
return;
}
inline void find_cycle(int u, int th){
while(true){
vis[u] = th;
if (vis[nxt[u]] == 0){
u = nxt[u];
}
else if (vis[nxt[u]] == th){
get_cycle(nxt[u]);
break;
}
else if (vis[nxt[u]] != th){
break;
}
}
return;
}
inline void DFS(int u){
if (in_cycle[u] != -1 || vis[u] != 0) return;
if (in[u] > 1){
q.push_back(u);
return;
}
res++;
vis[u] = 1;
int v = nxt[u];
if (in_cycle[v] != -1 && vec[in_cycle[v]].size() == 2) return;
if (!vis[v]){
vis[v] = 1;
DFS(nxt[v]);
}
return;
}
inline void DFS1(int u){
if (in_cycle[u] != -1 || vis[u] != 0) return;
res++;
vis[u] = 1;
int v = nxt[u];
if (in_cycle[v] != -1 && vec[in_cycle[v]].size() == 2) return;
if (!vis[v]){
vis[v] = 1;
DFS1(nxt[v]);
}
return;
}
inline void solve(const vector<int>& v){
if (v.size() == 2 && vis[v[0]] == 0 && vis[v[1]] == 0)
return;
vector<int> num;
int sum = 0;
for (int u : v){
if (vis[u]){
num.push_back(sum);
sum = 0;
}
else sum++;
}
if (num.empty()) num.push_back(sum);
else num[0] += sum;
for (int x : num) res += (x / 2) + (x % 2);
return;
}
int main(){
// freopen("CHUNG.INP", "r", stdin);
// freopen("TEST1.OUT", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
if ((n % 2) != 0){
cout << -1;
return 0;
}
memset(vis, 0, sizeof(vis));
memset(in_cycle, -1, sizeof(in_cycle));
for (int i = 1; i <= n; ++i) if (vis[i] == 0){
find_cycle(i, ++rep);
}
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; ++i) if (in[i] == 0){
DFS(i);
}
for (int i : q) if (!vis[i]){
DFS1(i);
}
for (const vector<int>& v : vec){
solve(v);
}
cout << res << '\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... |