不要问我为什么WA这么多次。。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 100050 #define inf 1000000007 using namespace std; int n,a,b,aft[maxv][3],deg[maxv],stack[maxv],top=0,regis[maxv],mx=0; int cnt[maxv*2],ans=inf; bool vis[maxv]; bool check(int x,int cnt,int fath) { if (x==1) { if (cnt==n+1) return true; else if (cnt!=1) return false; } stack[cnt]=x; for (int i=1;i<=2;i++) { if ((!vis[aft[x][i]]) && (aft[x][i]!=fath)) { vis[aft[x][i]]=true; return check(aft[x][i],cnt+1,x); } } return false; } int main() { memset(deg,0,sizeof(deg)); scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d",&a,&b); deg[a]++;deg[b]++;aft[i][1]=a;aft[i][2]=b; } for (int i=1;i<=n;i++) { if (deg[i]!=2) { printf("-1\n"); return 0; } } if (!check(1,1,1)) {printf("-1\n");return 0;} mx=0;memset(cnt,0,sizeof(cnt)); for (int i=1;i<=n;i++) { int r=i-stack[i]; if (r>=0) cnt[r]++; else cnt[n+r]++; } for (int i=0;i<=n;i++) mx=max(mx,cnt[i]); ans=min(ans,n-mx); for (int i=n;i>=1;i--) regis[n-i+1]=stack[i]; mx=0;memset(cnt,0,sizeof(cnt)); for (int i=1;i<=n;i++) { int r=i-regis[i]; if (r>=0) cnt[r]++; else cnt[n+r]++; } for (int i=0;i<=n;i++) mx=max(mx,cnt[i]); ans=min(ans,n-mx); printf("%d\n",ans); return 0; }