这道题唯一一个注意的地方是,如出现X\/Y=0这种关系时,X=0,Y=0。已经是可以肯定的关系了,所以可以连边X->-X。
我也错了上面这地方。看来,还不够。以后要细心才好。
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN=;
const int MAXM=;
int n,m;
char s[];
int head[MAXN],dfn[MAXN],low[MAXN],st[MAXN],tot,stop,indx,pat,belong[MAXN];
bool stack[MAXN];
struct{
int u,v;
int next;
}edge[MAXM];
void addedge(int u,int v){
edge[tot].u=u;
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void tarjan(int u){
int v;
dfn[u]=low[u]=++indx;
st[stop++]=u;
stack[u]=true;
for(int e=head[u];e!=-;e=edge[e].next){
v=edge[e].v;
if(dfn[v]==){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(stack[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
pat++;
do{
v=st[--stop];
belong[v]=pat;
stack[v]=false;
}while(u!=v);
}
}
int main(){
int u,v,c;
while(scanf("%d%d",&n,&m)!=EOF){
memset(head,-,sizeof(head));
tot=stop=indx=pat=;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(stack,false,sizeof(stack));
memset(belong,,sizeof(belong));
for(int i=;i<m;i++){
scanf("%d%d%d%s",&u,&v,&c,s);
if(strcmp(s,"OR")==){
if(c==){
addedge(\*u,\*u+);
addedge(\*v,\*v+);
}
else{
addedge(\*u+,\*v);
addedge(\*v+,\*u);
}
}
else if(strcmp(s,"AND")==){
if(c==){
addedge(\*u,\*v+);
addedge(\*v,\*u+);
}
else {
addedge(\*u+,\*u);
addedge(\*v+,\*v);
}
}
else{
if(c==){
addedge(\*u,\*v);
addedge(\*v,\*u);
addedge(\*u+,\*v+);
addedge(\*v+,\*u+);
}
else{
addedge(\*u,\*v+);
addedge(\*u+,\*v);
addedge(\*v,\*u+);
addedge(\*v+,\*u);
}
}
}
for(int i=;i<\*n;i++){
if(dfn\[i\]==){
tarjan(i);
}
}
bool flag=true;
for(int i=;i<n;i++){
if(belong\[i\*\]==belong\[\*i+\]){
printf("NO\\n");
flag=false;
break;
}
}
if(flag)
printf("YES\\n");
}
return ;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章