题意:树的每一个节点都有一个权值都大于1。。给你一些条件判断这些条件是否都满足。。
弱校,水平本来就差,还不好好努力。被虐了活该。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N = 10009;
const int INF = 0x3f3f3f3f;
struct LT{
int nex,to;
} L[N];
int F[N],cnt;
void add(int f,int t){
L[cnt].nex = F[f];
L[cnt].to = t;
F[f]=cnt++;
}
int re[N],n,m;
int xy[N],dy[N];//,dy2[N];
bool fin = false;
int dfs(int k)
{
if(fin) return 0;
int ans = 0;
for(int i = F[k];i;i=L[i].nex)
{
int to = L[i].to;
int c = dfs(to);
ans+=c;
}
if(re[k]>0)
{
if(re[k] > ans) ans = re[k];
else fin = true;
if(ans <= dy[k]) fin = true;
if(ans >= xy[k]) fin = true;
}
else
{
ans++;
if(ans<=dy[k]) ans = dy[k]+1;
if(ans>=xy[k]) fin =true;
}
return ans;
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
fin = false;
memset(re,0,sizeof(re));
memset(dy,0,sizeof(dy));
memset(xy,INF,sizeof(xy));
int tmp;cnt=1;
memset(F,0,sizeof(F));
for(int i=2;i<=n;i++)
{
scanf("%d",&tmp);
add(tmp,i);
}
scanf("%d",&m);
int l,r;
char a[10];
for(int i=0;i<m;i++)
{
scanf("%d %s %d",&l,a,&r);
if(a[0]=='>')
{
if(dy[l]<r) dy[l] = r;
}
else if(a[0]=='<')
{
if(xy[l]>r) xy[l] = r;
}
else
{
if(re[l]==0)
re[l]=r;
else if(re[l]!=r)
fin = true;
if(r==0) fin = true;
}
}
if(fin)
{
printf("Lie\n");
continue;
}
dfs(1);
if(fin)
{
printf("Lie\n");
}else
{
printf("True\n");
}
}
return 0;
}
本文介绍了一种解决特定树形结构问题的方法,通过深度优先搜索实现节点权值的计算,并确保所有给定条件得以满足。文章提供了一个完整的C++代码示例。
1590

被折叠的 条评论
为什么被折叠?



