1 条题解

  • 0
    @ 2026-6-22 11:21:19
    #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
    上传者