HDU 4274 Spy's Work

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=11000;
struct Edge{
    int v,w,nex;
}edge[MAXN];
int tot,u,v,w;
int head[MAXN];
int dist[MAXN];
int n,m;
bool ans;
char ch;
vector<int> G[MAXN];
int up[MAXN],down[MAXN];
void addedge(int u,int v,int w)
{
    edge[tot].v=v;
    edge[tot].w=w;
    edge[tot].nex=head[u];
    head[u]=tot++;
}

void dfs(int u,int pre)
{
    int sum=1;
    for(int i=0;i<G[u].size();i++)
    {
        if(G[u][i]==pre)
            continue;
        dfs(G[u][i],u);
        sum+=down[G[u][i]];
    }
    if(down[u])
    {
        if(up[u]!=-1)
        {
            if(sum>up[u])
                ans=true;
            else
                down[u]=max(down[u],sum);
        }
    }
    else
        down[u]=sum;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
        ans=false;
        for(int i=1;i<=n;i++)
        {
            down[i]=0;
            up[i]=-1;
            G[i].clear();
        }
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&u);
            G[u].push_back(i);
        }
        scanf("%d",&m);
        while(m--)
        {
            scanf("%d %c %d",&u,&ch,&w);
            if(ch=='=')
                up[u]=down[u]=w;
            if(ch=='<')
                up[u]=w-1;
            if(ch=='>')
                down[u]=w+1;
        }
        dfs(1,-1);
        for(int i=1;i<=n;i++)
            if(up[i]!=-1&&up[i]<down[i])
            {
                ans=true;
                break;
            }
        printf("%s\n",ans?"Lie":"True");
    }
    return 0;
}
View Code

 

posted on 2015-09-04 16:17  onlyAzha  阅读(82)  评论(0编辑  收藏  举报

导航