1 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=205; int t,n,m; int head[N],idx; struct Edge{int to,ne;}e[4005]; int dfn[N],low[N],tim,stk[N],top,scc[N],cnt; char s1[5],s2[5]; void add(int a,int b){ e[++idx].to=b; e[idx].ne=head[a]; head[a]=idx; } void tarjan(int x){ dfn[x]=low[x]=++tim; stk[++top]=x; for(int i=head[x];i;i=e[i].ne){ int y=e[i].to; if(!dfn[y]){ //若y尚未访问 tarjan(y); low[x]=min(low[x],low[y]); } else if(!scc[y]) //若y已访问且未处理 low[x]=min(low[x],dfn[y]); } if(low[x]==dfn[x]){ //若x是SCC的根 ++cnt; for(int y=-1;y!=x;) scc[y=stk[top--]]=cnt; } } int main(){ scanf("%d",&t); while(t--){ idx=tim=cnt=top=0; memset(head,0,sizeof head); memset(dfn,0,sizeof dfn); memset(scc,0,sizeof scc); scanf("%d%d",&n,&m); while(m--){ scanf("%s%s",&s1,&s2); int i=0,j=0,a,b,k; a=(s1[0]=='m'?0:1); b=(s2[0]=='m'?0:1); for(k=1;s1[k]>='0'&&s1[k]<='9';) i=i*10+s1[k++]-'0'; for(k=1;s2[k]>='0'&&s2[k]<='9';) j=j*10+s2[k++]-'0'; add(i+n*!a,j+n*b); add(j+n*!b,i+n*a); } for(int i=1;i<=n<<1;++i)if(!dfn[i])tarjan(i); bool flag=0; for(int i=1;i<=n;++i) if(scc[i]==scc[i+n]){ flag=1; break; } flag?puts("BAD"):puts("GOOD"); } }
- 1
信息
- ID
- 3479
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者