求调,subtask#2 WA第三个点,subtask#4 WA前三个点
查看原帖
求调,subtask#2 WA第三个点,subtask#4 WA前三个点
1092180
wangxw楼主2024/3/3 21:12
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;

vector<int> G[maxn],scc[maxn],nG[maxn];
int dfn[maxn],low[maxn],c[maxn],color[maxn],ncolor[maxn],in[maxn],topo[maxn];
int cnt,num;
stack<int> s;
bool ins[maxn],vis[maxn];

void tarjan(int x){
  s.push(x);ins[x]=1;
  dfn[x]=low[x]=++num;
  for(auto u:G[x]){
    if(!dfn[u]){
      tarjan(u);
      low[x]=min(low[x],low[u]);
    }else if(ins[u]){
      low[x]=min(low[x],dfn[u]);
    }
  }
  if(dfn[x]==low[x]){
    ++cnt;
    int a;
    do{
      a=s.top();
      c[a]=cnt;
      scc[cnt].push_back(a);
      s.pop();ins[a]=0;
    }while(a!=x);
  }
}

bool bob(){
  if(cnt==2){
    for(int i=1;i<=cnt;i++){
      if(ncolor[i]&&nG[i].size()&&!ncolor[nG[i][0]]) return true;
    }
    if(!in[1]&&!in[2]&&ncolor[1]&&ncolor[2]) return true;
  }
  bool ok=true;
  for(int i=1;i<=cnt;i++){
    if(ncolor[i]){
      ok=false;
    }
  }
  if(ok){
    return true;
  } 
  return false;
}

int toposort(){
  int tot=0;
  queue<int> q;
  for(int i=1;i<=cnt;i++){
    if (in[i]==0) q.push(i);
  }
  while(!q.empty()){
    int u=q.front();
    q.pop();
    topo[tot++]=u;
    for(auto v:nG[u]){
      if(--in[v]==0){
        q.push(v);
      }
    }
  }
  return tot;
}

bool dfs(int x){
  if(!ncolor[x]){
    return false;
  }
  vis[x]=true;
  for(auto u:nG[x]){
    bool can=dfs(u);
    if(!can){
      return false;
    }
  }
  return true;
}

int main(){
  int t;
  cin>>t;
  while(t--){
    int n,m;
    cin>>n>>m;
    memset(low,0,sizeof(low));
	memset(dfn,0,sizeof(dfn));
	memset(color,0,sizeof(color));
	memset(ins,false,sizeof(ins));
	memset(vis,false,sizeof(vis));
	memset(in,0,sizeof(in));
	memset(ncolor,0,sizeof(ncolor));
	memset(c,0,sizeof(c));
	memset(topo,0,sizeof(topo));
	for(int i=1;i<=n;i++) G[i].clear(),nG[i].clear(),scc[i].clear();
	cnt=num=0;
	while(!s.empty()) s.pop();
    
    for(int i=1;i<=n;i++){
      cin>>color[i];
    }
    for(int i=0;i<m;i++){
      int u,v;
      cin>>u>>v;
      G[u].push_back(v);
    }
    
    for(int i=1;i<=n;i++){
      if(!dfn[i]) tarjan(i);
    }
    bool ok=true;
    for(int i=1;i<=cnt;i++){
      int c=color[scc[i][0]];
      ncolor[i]=c;
      if(ok){
        for(auto u:scc[i]){
          if(color[u]!=c){
            cout<<"N";
            ok=false;
            break;
          }
        }
      }
	  else{
		continue; 
	  } 
    }
    for(int i=1;i<=n;i++){
      for(auto u:G[i]){
        if(c[i]!=c[u]){
          in[c[u]]++;
          nG[c[i]].push_back(c[u]);
        }
      }
    }
    bool bc=bob();
    if(bc){
      cout<<"B";
      continue;
    }
    int num=toposort();
    bool ac;
    for(int i=1;i<=n;i++){
      if(ncolor[topo[i]]){
        ac=dfs(i);
        if(ac){
          for(int i=1;i<=cnt;i++){
            if(!vis[i]&&ncolor[i]){
              ac=false;
            }
          }
        }
        break;
      }
    }
    if(ac){
      cout<<"A";
      continue;
    }
    if(ok){
    	cout<<"N";
    	continue;
	}
  }
  return 0;
}

2024/3/3 21:12
加载中...