hdu 4274 树形dp

现在的做题状态好差啊,题目没思路,就算有思路了写对的概率也好小啊,总是这里那里出现问题。前天上课,老师在上面讲我在下面敲代码,写了好久,那个比赛就写了最水的一题,连自己的模板都忘记用了!无语了!!!!

题意:给定一个职员的关系,也就是一个树,和以某一个节点为根的子树的条件,判断这些条件是否都成立!

昨天看这道题的时候似乎题意都没有真正理解,然后就是肯定也没写,还一直以为是差分约束。。。

解题思路: 树形dp,建树,对于每个节点,有一个最大值和最小值,如果最小值大于最大值那么肯定是不会满足的,要注意,最小值最小为1,为此贡献了n次wa啊!

/
// File Name: 4274.cpp
// Author: wang
// mail: 
// Created Time: 2013-9-12 20:47:59
/
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <cmath>

#include <algorithm>
#include<iostream>
#include<queue>
#include <map>
using namespace std;
typedef long long ll;
#define INF (INT_MAX/10)
#define SQR(x) ((x)*(x))
#define rep(i, n) for (int i=0; i<(n); ++i)
#define repf(i, a, b) for (int i=(a); i<=(b); ++i)
#define repd(i, a, b) for (int i=(a); i>=(b); --i)
#define clr(ar,val) memset(ar, val, sizeof(ar))
#define N 10005
#define inf INT_MAX 
struct node
{
    int y,pre;
};
node a[N*2];
int n,len,m;
int up[N],down[N];
int pre[N];
void addpage(int x,int y)
{
    a[len].pre=pre[x];
    a[len].y=y;
    pre[x]=len++;
}
bool dfs(int s)
{
    int sum=0;
    for(int i=pre[s]; i!=-1; i=a[i].pre)
    {
        int y=a[i].y;
        if(dfs(y)==false) return false; 
        sum+=down[y];
    }
    down[s]=max(sum+1,down[s]);//最小的
    if(down[s]>up[s]) return false;
    return true;
}
int main()
{
    int x,y; char s[2];
    while(scanf("%d",&n)!=EOF)
    {
        len=0;
        memset(pre,-1,sizeof(pre));
        repf(i,2,n){
            scanf("%d",&x);
                addpage(x,i);
        }
        scanf("%d",&m);
        repf(i,1,n) up[i]=inf,down[i]=1;
        while(m--)
        {
            scanf("%d%s%d",&x,s,&y);
            if(s[0]=='=')
                up[x]=down[x]=y;
            else if(s[0]=='<')
                up[x]=min(up[x],y-1);
            else
                down[x]=max(down[x],y+1);
        }
        if(dfs(1))
            printf("True\n");
        else
            printf("Lie\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定的小Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值