先以第一个数为1得到一个序列,检查其是否可以组成一个环。
t1[n],t2[n] 分别表示顺时针和逆时针转换下与自己的目标位置距离为n的数字个数之和。
这样就得到了最多的在自己原位上的人数maxn,用总人数-maxn即为答案。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int a[50002],h[50002][2],t1[50002],t2[50002];
int main()
{
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
int po=1,n,ok=0,maxn=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d %d",&h[i][0],&h[i][1]);
int i=a[1]=1;
int j=a[2]=h[1][0];
for(int k=3;k<=n;k++)
{
if(h[j][0]==i)
{
i=j;
j=h[j][1];
a[k]=j;
}
else if(h[j][1]==i)
{
i=j;
j=h[j][0];
a[k]=j;
}
else {printf("-1");return 0;}
}
for(i=1;i<=n;i++)
t1[(a[i]-i+n)%n]++;
for(i=1;i<=n;i++)
t2[(a[i]+i)%n]++;
for(i=0;i<n;i++)
{
maxn=max(maxn,t1[i]);
maxn=max(maxn,t2[i]);
}
printf("%d",n-maxn);
return 0;
}