没见过如此五彩斑斓的结果。
郁闷,调了一中午,实在没辙了,前来求助。
#include<bits/stdc++.h>
using namespace std;
int c,t,n,m,i,j;
int anss;
char vs;
struct a{
char value=0; //F:false T:true U:unknown
int father=0;
bool turnback; //0 一致 1 反转
} v[100005];
short visitdeep[100005];
inline char turnback(char a){
if(a=='U') return 'U';
if(a=='T') return 'F';
if(a=='F') return 'T';
return 0;
}
char get(int now,int deepth){
if(v[now].value!=0){
return v[now].value;
}
if(v[now].father==0&&v[now].value==0){
v[now].value='T';
return 'T';
}
char ans=0;
if(visitdeep[now]>=0){
if((deepth-visitdeep[now])%2==1) {
v[now].value='U';
return 'U';
}
else{
v[now].value='T';
return 'T';
}
}
visitdeep[now]=deepth;
if(v[now].turnback){
ans=turnback(get(v[now].father,deepth+1));
v[now].value=ans;
return ans;
}
else {
ans=get(v[now].father,deepth);
v[now].value=ans;
return ans;
}
}
int main(){
int l;
cin>>c>>t;
int ans=0;
for(;t>0;t--){
memset(v,0,sizeof(v));
cin>>n>>m;
l=m;
anss=0;
for(;m>0;m--){
cin>>vs;
switch(vs){
case 'T':
cin>>i;
v[i].value='T';
break;
case 'F':
cin>>i;
v[i].value='F';
break;
case 'U':
cin>>i;
v[i].value='U';
break;
case '+':
cin>>i>>j;
v[i].father=j;
v[i].turnback=false;
break;
case '-':
cin>>i>>j;
v[i].father=j;
v[i].turnback=true;
break;
}
}
for(int i=1;i<=n;i++){
memset(visitdeep,0xff,sizeof(visitdeep));
if(get(i,0)=='U') anss++;
}
cout<<anss<<endl;
}
}
谁知道哪里错了?谢谢各位大神。