Not so Mobile uva

水题。。不过貌似可以不建树。。。我还是建树了。。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<malloc.h>
using namespace std;
int ok;
struct Tree
{
    int Weight; /*重量*/
    int Length; /*长度*/
    Tree *Left;
    Tree *Right;
};
void BuildTree(Tree *node){
    int w1,l1,w2,l2;
    scanf("%d%d%d%d",&w1,&l1,&w2,&l2);
    if(w1 == 0){
         Tree *node_L = (Tree*)malloc(sizeof(Tree));
         node_L -> Length = l1;
         node_L -> Weight = 0;
         node -> Left = node_L;
         BuildTree(node_L);
    }
    else if(w1 != 0){
        Tree *node_L = (Tree*)malloc(sizeof(Tree));
        node_L -> Weight = w1;
        node_L -> Length = l1;
        node_L -> Left  = NULL;
        node_L -> Right = NULL;
        node -> Left = node_L;
    }
    if(w2 == 0){
         Tree *node_R = (Tree*)malloc(sizeof(Tree));
         node_R -> Length = l2;
         node_R -> Weight = 0;
         node -> Right = node_R;
         BuildTree(node_R);
    }
    else if(w2 != 0){
        Tree *node_R = (Tree*)malloc(sizeof(Tree));
        node_R -> Weight = w2;
        node_R -> Length = l2;
        node_R -> Left  = NULL;
        node_R -> Right = NULL;
        node -> Right = node_R;
    }
}
int dfs(Tree *node){
    if(node -> Weight == 0)
    node -> Weight = dfs(node -> Left)+dfs(node -> Right);
    return node -> Weight;
}
void Get_Tree(Tree *node){
    if(node -> Left != NULL){
        int x = ((node -> Left)->Weight)*((node -> Left)->Length);
        int y = ((node -> Right)->Weight)*((node -> Right)->Length);
        if(x != y){
            ok = 0;
            return ;
        }
        Get_Tree(node -> Left);
        Get_Tree(node -> Right);
    }
}
int main()
{
    int N;
    scanf("%d",&N);
    for(int Case = 1; Case <= N; Case ++){
          Tree *root = (Tree*)malloc(sizeof(Tree));
          root -> Weight = 0;
          root -> Length = 0;
          BuildTree(root);
          dfs(root);
          ok = 1;
          Get_Tree(root);
          if(ok)
          printf("YES");
          else
          printf("NO");
          printf("\n");
          if(Case < N)
          printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值