UVA 839

#include<iostream>
#include<string>
using namespace std;
int flag=1;
typedef  struct  node
{
    int W1,D1,Wr,Dr;
    struct node *left,*right;
}bitnode,*bitree;

void createtree(bitree *T)
{
    bitnode bit;
    cin>>bit.W1>>bit.D1>>bit.Wr>>bit.Dr;
    *T=new node;
    (*T)->D1=bit.D1;
    (*T)->Dr=bit.Dr;
    (*T)->W1=bit.W1;
    (*T)->Wr=bit.Wr;
    if(bit.W1&&bit.Wr)
    {
        (*T)->left=NULL;
        (*T)->right=NULL;
    }
    else 
    {
        if(bit.W1&&!bit.Wr)
        {
            (*T)->left=NULL;
            createtree(&((*T)->right));
        }
        if(bit.Wr&&!bit.W1)
        {
            (*T)->right=NULL;
            createtree(&((*T)->left));
        }
        if(!bit.Wr&&!bit.W1)
        {
        createtree(&((*T)->left));
        createtree(&((*T)->right));
        }
    }
}

void  dfs(bitree T,int *sum)
{
    if(T)
    {
        *sum+=T->W1+T->Wr;
        dfs(T->left,sum);
        dfs(T->right,sum);
    }
}
void is_yes(bitree T)
{
    if(T)
    {
        int x=0,y=0;
        int sum_x=0,sum_y=0;
        int *sum_xp=&sum_x,*sum_yp=&sum_y;
        if(!T->left)
            sum_x=T->W1;
        else
            dfs(T->left,sum_xp);
        if(!T->right)
            sum_y=T->Wr;
        else
            dfs(T->right,sum_yp);
        x=(T->D1)*sum_x;
        y=(T->Dr)*sum_y;
        if(x!=y)
        {
            flag=0;
            return ;
        }
        is_yes(T->left);
        is_yes(T->right);
    }
}
int main()
{
    int sum;
    cin>>sum;
    while(sum--)
    {
        flag=1;
        bitree T;
        T=NULL;
        createtree(&T);
        is_yes(T);
        if(flag==0)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
        if(sum)cout<<endl;
    }
    return 0;
}

 

posted @ 2012-05-16 00:26  open your eyes  阅读(319)  评论(0)    收藏  举报