2013年11月7日 星期四

[HOJ] 228 - Mobiles


#include<stdio.h>
struct P{
    int L,R;
}s[100005];
int v[100005]={0},flag=0,p=-1,Y,add=0;
int dfs(int k){
    if(k==-1) return 1;
    int A,B,r;
    A=dfs(s[k].L);
    B=dfs(s[k].R);
    if(A<B) add++,r=s[k].L,s[k].L=s[k].R,s[k].R=r;
    return A+B;
}
void check(int k,int u){
    if(k==-1){
        if(p==-1) p=u,Y=u;
        else{
            if(p-u!=1 && p-u!=0) flag=1;
            p=u;
            if(Y-p!=1 && Y-p!=0) flag=1;
        }
        return;
    }
    check(s[k].L,u+1),check(s[k].R,u+1);
}
int main(){
    int n,i,x,y;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d%d",&s[i].L,&s[i].R);
        if(s[i].L!=-1) v[s[i].L]=1;
        if(s[i].R!=-1) v[s[i].R]=1;
    }
    for(i=1;i<=n;i++){
        if(!v[i]){
            dfs(i);
            check(i,0);
            break;
        }
    }
    if(flag) puts("-1");
    else printf("%d\n",add);
}

沒有留言:

張貼留言