您的位置:首页 > 其它

hdu 4274 Spy's Work

2013-08-27 17:40 344 查看
题意:大概意思就是有n个部门,每个部门有一个部长,编号为i的人就是第i个部门的部长,1代表boss。除了boss每个人都有一个上司,一个部门的成员包括部长和他的下属,部门的总工资为所有成员的工资和,另外一个人得工资至少为1,给出每个部门工资的限制信息,求是否有矛盾。

思路:其实这题弄明白题意也不是很难想,对于每部门,维护两个值,一个是工资上限,一个是工资下限,如果上限小于下限,那么久说明有矛盾,最开始这两个值都赋值为1和inf就行了。



代码:



#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=10000+10;
struct Info
{
    int type,w;
};
vector<int>G[maxn];
int uplim[maxn],downlim[maxn];
bool flag;
void clearAll(int n)
{
    for(int i=0;i<=n;++i) G[i].clear();
    for(int i=1;i<=n;++i)
    {
        uplim[i]=inf;
        downlim[i]=1;
    }
}
void dfs(int u,int fa)
{
    if(!flag) return;
    int sum=0;
    for(int i=0;i<G[u].size();++i)
    {
        int v=G[u][i];
        if(v!=fa)
        {
            dfs(v,u);
            sum+=downlim[v];
        }
    }
    downlim[u]=max(downlim[u],sum+1);
    if(downlim[u]>uplim[u])
        flag=false;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n,m;
    while(~scanf("%d",&n))
    {
        clearAll(n);
        int a,b;
        char str[2];
        for(int i=2;i<=n;++i)
        {
            scanf("%d",&a);
            G[a].push_back(i);
            G[i].push_back(a);
        }
        flag=true;
        scanf("%d",&m);
        for(int i=0;i<m;++i)
        {
            scanf("%d %s %d",&a,str,&b);
            if(str[0]=='=')
              uplim[a]=downlim[a]=b;
            else if(str[0]=='<')
              uplim[a]=min(uplim[a],b-1);
            else
              downlim[a]=max(downlim[a],b+1);
        }
        dfs(1,-1);
        if(flag) puts("True");
        else puts("Lie");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: