#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
map<string,int> mp;
pair<string,string> arr[N];
int p[N],indeg[N];
bool out[N];
int main(){
int n,ans;
cin>>n;
ans=n;
for(int i=1;i<=n;i++){
cin>>arr[i].first >>arr[i].second;
}
if(n%2==1){
cout<<-1;
return 0;
}
for(int i=1;i<=n;i++) mp[arr[i].first]=i;
for(int i=1;i<=n;i++){
p[i]=mp[arr[i].second];
}
for(int i=1;i<=n;i++) indeg[p[i]]++;
for(int i=1;i<=n;i++){
if(out[i]) continue;
if(p[p[i]]==i && p[i]!=i){
out[i]=true,out[p[i]]=true,ans-=2;
}
}
//for(int i=1;i<=n;i++) cout<<i <<" " <<p[i] <<"\n";
queue<int> q;
for(int i=1;i<=n;i++) if(indeg[i]==0) q.push(i);
while(!q.empty()){
int u=q.front();
q.pop();
if(out[u] || out[p[u]]) continue;
ans--;
indeg[p[p[u]]]--;
out[u]=out[p[u]]=true;
if(indeg[p[p[u]]]==0) q.push(p[p[u]]);
}
//cout<<ans <<"\n";
for(int i=1;i<=n;i++) if(out[i]==false && out[p[i]]==true) out[i]=true;
for(int i=1;i<=n;i++){
if(out[i] || p[i]==i) continue;
int u=p[i],cnt=1;
//cout<<i <<"\n";
while(u!=i){
cnt++;
out[u]=true;
u=p[u];
}
//cout<<"\n";
ans-=cnt/2;
}
cout<<ans;
}
# | 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... |