简单的深搜。。。
#include<iostream> #include<cstring> #include <cstdio> #include<string> #include<queue> #include<vector> #include<map> #include <set> #include<ctime> #include<cmath> #include <cstdlib> #include<algorithm> using namespace std; const int N = 10010; const int INF = (((int) 1)<<30); int dp[N][3]; vector<int> G[N]; int dfs(int u){ int sum=0; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(!dfs(v)) return false; sum+=dp[v][1]; } dp[u][1]=max(dp[u][1],sum+1); if(dp[u][1]>dp[u][2]) return false; else return true; } int main(){ int n,m; while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++){ dp[i][1]=1; dp[i][2]=INF; G[i].clear(); } for(int i=2;i<=n;i++){ int x; scanf("%d",&x); G[x].push_back(i); } scanf("%d",&m); while(m--){ int a,b; char s[5]; scanf("%d%s%d",&a,s,&b); if(s[0]=='=') { dp[a][1]=max(dp[a][1],b); dp[a][2]=min(dp[a][2],b); }else if(s[0]=='>') { dp[a][1]=max(dp[a][1],b+1); }else if(s[0]=='<'){ dp[a][2]=min(dp[a][2],b-1); } } if(dfs(1)) printf("True\n"); else printf("Lie\n"); }return 0; }