Lang:G++
Edit12345678910111213141516171819202122232425262728293031#include <iostream>#include <vector>using namespace std;const int maxn=101;const int inf=(1<<30);int n;vector<int> a[maxn];string nodestring[maxn];bool nodevalue[maxn];int f[maxn]; //dp数组,f[i]表示编号为i的结点所统领的子树想要改变值最少需要几次翻转,无法改变的情况被表示为infvoid getans(){for(int i=1;i<=n;i++) f[i]=inf; //初始化for(int i=n;i>=1;i--){//先计算结点i的值if(nodestring[i]=="TRUE") nodevalue[i]=true;else if(nodestring[i]=="FALSE") nodevalue[i]=false;else{if(nodestring[i]=="AND"){int num=a[i].size();nodevalue[i]=true;for(int j=0;j<num;j++) nodevalue[i]=(nodevalue[i]&&nodevalue[a[i][j]]);}else if(nodestring[i]=="OR"){int num=a[i].size();nodevalue[i]=false;for(int j=0;j<num;j++) nodevalue[i]=(nodevalue[i]||nodevalue[a[i][j]]);}