POJ 3678
阅读原文时间:2023年07月11日阅读:1

这道题唯一一个注意的地方是,如出现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 ;  

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章