codevs 1106 篝火晚会

不要问我为什么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
");
            return 0;
        }
    }
    if (!check(1,1,1)) {printf("-1
");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
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/ziliuziliu/p/5756585.html