传送门biu~
2-SAT裸题。详见代码。
#include<bits/stdc++.h>
using namespace std;
int n,m,num,time_clock,top;
int head[205],nex[2005],to[2005],in[205],tp;
int low[205],dfn[205],stac[205];
inline void add(int x,int y){
nex[++tp]=head[x];
head[x]=tp;
to[tp]=y;
}
inline int read(){
char s[15];
scanf("%s",s+1);
int L=strlen(s+1);
int re=0,p=(s[1]=='h');
for(int i=2;i<=L;++i) re=re*10+s[i]-'0';
re=re<<1|p;
return re;
}
void dfs(int x){
low[x]=dfn[x]=++time_clock;
stac[++top]=x;
for(int i=head[x];i;i=nex[i]){
if(in[to[i]]) continue;
if(dfn[to[i]]) low[x]=min(low[x],dfn[to[i]]);
else{
dfs(to[i]);
low[x]=min(low[x],low[to[i]]);
}
}
if(low[x]==dfn[x]){
++num;
while(stac[top]!=x) in[stac[top--]]=num;
in[stac[top--]]=num;
}
}
inline void tarjan(){
for(int i=2;i<=2*n+1;++i) if(!dfn[i]) dfs(i);
for(int i=2;i<=2*n+1;i+=2){
if(in[i]==in[i^1]){
printf("BAD\n");
return;
}
}
printf("GOOD\n");
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(in,0,sizeof(in));
memset(head,0,sizeof(head));
num=tp=top=time_clock=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int a=read(),b=read();
add(a^1,b);add(b^1,a);
}
tarjan();
}
return 0;
}