Submission #2126061


Source Code Expand

#include<iostream>
#include<cstring>
#include<cstdio>
#define MN 100000
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,head[MN+5],cnt=1,ans=0,f[MN+5],g[MN+5][2],Fa[MN+5],dep[MN+5],A,B,C,c[MN+5],num,mn=1e9,q[MN+5],top;
struct edge{int to,next;}e[MN*2+5];
inline void ins(int f,int t)
{
    e[++cnt]=(edge){t,head[f]};head[f]=cnt;
    e[++cnt]=(edge){f,head[t]};head[t]=cnt;
}
inline int Abs(int x){return x<0?-x:x;}
void dfs(int x,int fa=0)
{
    ++g[x][f[x]];
    for(int i=head[x];i;i=e[i].next)
        if(e[i].to!=fa)
        {
            if(x==A&&e[i].to==B) continue;
            if(x==B&&e[i].to==A) continue;
            f[e[i].to]=f[x]^1;dfs(e[i].to,x);
            g[x][0]+=g[e[i].to][0];
            g[x][1]+=g[e[i].to][1];
        }
    ans+=Abs(g[x][0]-g[x][1]);
}
void FindCircle(int x,int fa)
{
    Fa[x]=fa;
    for(int i=head[x];i;i=e[i].next)
        if(e[i].to!=fa)
        {
            if(dep[e[i].to]) A=x,B=e[i].to;
            else dep[e[i].to]=dep[x]+1,FindCircle(e[i].to,x);
        }
}
int main()
{
    n=read();m=read();if(n&1) return 0*puts("-1");
    if(m<n)
    {
        for(int i=1;i<n;++i) ins(read(),read());
        dfs(1);
        printf("%d\n",g[1][0]==g[1][1]?ans:-1);
    }
    else
    {
        for(int i=1;i<=n;++i) ins(read(),read());
        FindCircle(dep[1]=1,0);
        for(int x=A,y=B;x!=y;C=x=Fa[x])
            if(dep[x]<dep[y]) swap(x,y);
        for(int i=A;i!=C;i=Fa[i]) c[++num]=i;
        c[++num]=C;int len=dep[A]+dep[B]-2*dep[C]+1;num=len;
        for(int i=B;i!=C;i=Fa[i]) c[len--]=i;
        if(dfs(1),num&1)
        {
            if(Abs(g[1][1]-g[1][0])&1) return 0*puts("-1");
            int dif=(g[1][1]-g[1][0])/2;ans=Abs(dif);
            for(int i=A;i;i=Fa[i]) g[i][0]+=dif;
            for(int i=B;i;i=Fa[i]) g[i][0]+=dif;
            for(int i=1;i<=n;++i) ans+=Abs(g[i][0]-g[i][1]);
            printf("%d\n",ans);
        }
        else
        {
            if(g[1][0]!=g[1][1]) return 0*puts("-1");
            for(int i=A;i!=C;i=Fa[i]) q[++top]=g[i][0]-g[i][1];
            for(int i=B;i!=C;i=Fa[i]) q[++top]=g[i][1]-g[i][0];
            sort(q+1,q+top+1);
            int res;
            if(top&1) res=q[(top+1)/2];
            else res=Abs(q[top/2])<Abs(q[top/2+1])?q[top/2]:q[top/2+1];
            res=-res;
            for(int i=A;i;i=Fa[i]) g[i][0]+=res;
            for(int i=B;i;i=Fa[i]) g[i][1]+=res;
            ans=Abs(res);for(int i=1;i<=n;++i) ans+=Abs(g[i][0]-g[i][1]);
            printf("%d\n",ans);
        }
    }
    return 0;
}

Submission Info

Submission Time
Task F - Namori
User FallDream
Language C++14 (GCC 5.4.1)
Score 0
Code Size 2778 Byte
Status CE

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:77:29: error: ‘sort’ was not declared in this scope
             sort(q+1,q+top+1);
                             ^