https://www.luogu.com.cn/problem/P4171
https://lydsy.com/JudgeOnline/problem.php?id=1823
辣鸡bzoj又不能用auto
裸中裸,8说了。
yyb的2-sat列表难度顺序不太对。。。我觉得入门题那个dfs反而比较麻烦。。。
#include<bits/stdc++.h>
using namespace std;
const int maxl=210;
int n,m,ind,top,ff,ans;
int dfn[maxl],low[maxl],f[maxl],s[maxl];
bool in[maxl];
vector <int> e[maxl];
char ch[maxl];
inline int opp(int u)
{
if(u>n) return u-n;
else return u+n;
}
inline void prework()
{
scanf("%d%d",&n,&m);
ff=0;ind=0;top=0;ans=1;
for(int i=1;i<=2*n;i++)
{
dfn[i]=low[i]=f[i]=0;
e[i].clear();in[i]=true;
}
int u,v,l;
for(int i=1;i<=m;i++)
{
u=0;
scanf("%s",ch+1);
l=strlen(ch+1);
for(int j=2;j<=l;j++)
u=u*10+ch[j]-'0';
if(ch[1]=='h')
u+=n;
v=0;
scanf("%s",ch+1);
l=strlen(ch+1);
for(int j=2;j<=l;j++)
v=v*10+ch[j]-'0';
if(ch[1]=='h')
v+=n;
e[opp(u)].push_back(v);
e[opp(v)].push_back(u);
}
}
inline void tarjan(int u)
{
dfn[u]=low[u]=++ind;
in[u]=true;s[++top]=u;
for(auto v : e[u])
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(in[v])
low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u])
{
ff++;int v;
do
{
v=s[top--];
f[v]=ff;in[v]=false;
}while(u!=v);
}
}
inline void mainwork()
{
ans=1;
for(int i=1;i<=2*n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++)
if(f[i]==f[i+n])
ans=0;
}
inline void print()
{
if(ans)
puts("GOOD");
else
puts("BAD");
}
int main()
{
int t=1;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}