#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define dwn(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int maxn=50050; int maxx(int a,int b){return a<b?b:a;} int n,Ans,a[2*maxn],b[maxn],ls[maxn],nd[maxn][2],nt[maxn][2],ji[maxn]; int vis[4*maxn]; void worrk(){ memset(vis,0,sizeof(vis)); rep(i,1,n)ls[b[i]]=i;//离散化,将目标序列映射成1-n rep(i,1,n)a[i]=ls[a[i]]; rep(i,1,n)a[i+n]=a[i];//断链为环 int re=a[1]-1,ji=0; int ans=0; rep(i,1,n)vis[2*n+a[i]-i]++; ans=max(ans,vis[2*n+0]); rep(k,1,n){ vis[2*n+a[n+k]-n-k]++;//和下标做差,若平移了k次,那么就要统计-k的个数 vis[2*n+a[k]-k]--; ans=max(ans,vis[2*n-k]); } Ans=min(Ans,n-ans); } int main(){ scanf("%d",&n); rep(i,1,n){ int a,b; scanf("%d%d",&a,&b); nd[i][0]=a; nd[i][1]=b; if(a==b||a==i||b==i){ cout<<-1; return 0; } if(ji[a]>=2||ji[b]>=2){ cout<<-1; return 0; } nt[a][ji[a]++]=i; nt[b][ji[b]++]=i; } rep(i,1,n){ int pd=0; if(nd[i][0]==nt[i][0]&&nd[i][1]==nt[i][1])pd=1; if(nd[i][0]==nt[i][1]&&nd[i][1]==nt[i][0])pd=1; if(pd==0){ cout<<-1; return 0; } } Ans=2000000; rep(i,1,n) a[i]=i; b[1]=1;b[2]=nt[1][0];b[n]=nt[1][1]; rep(i,3,n-1){ if(b[i-2]==nt[b[i-1]][0])b[i]=nt[b[i-1]][1]; else b[i]=nt[b[i-1]][0]; } worrk(); rep(i,1,n) a[i]=i; b[1]=1;b[2]=nt[1][1];b[n]=nt[1][0]; rep(i,3,n-1){ if(b[i-2]==nt[b[i-1]][0])b[i]=nt[b[i-1]][1]; else b[i]=nt[b[i-1]][0]; } worrk(); cout<<Ans; return 0; }