秋秋辣,调了3天不知道怎么改了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#define pb push_back
using namespace std;
namespace INPUT{
char buf[1<<20],*p1,*p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
}
using namespace INPUT;
template<typename T>
T read(){
char ch=gc();
T x=0,p=1;
while(ch<'0'||ch>'9'){
if(ch=='-') p=-1;
ch=gc();
}
while(ch<='9'&&ch>='0'){
x=(x<<3)+(x<<1)+(ch^48);
ch=gc();
}
return x*p;
}
const int N=1e5+5;
vector<int>G[N];
void add(int u,int v){G[u].pb(v);}
int dfn[N],low[N],inde;
stack<int>s;bool vis[N];
int scc[N],sc;
void tarjan(int u){
dfn[u]=low[u]=++inde;
s.push(u),vis[u]=true;
for(auto v:G[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
sc++;
while(!s.empty()){
int t=s.top();
s.pop(),vis[t]=false;
scc[t]=sc;
if(u==t) break;
}
}
}
int n,m;
int color[N],col[N];
vector<int>T[N];int ru[N];
void add_T(int u,int v){
T[u].pb(v),ru[v]++;
}
//复用vis[]
bool IsFill,Afail;
void fill(int u){
vis[u]=true;
for(auto v:T[u]) fill(v);
}
void toposort(){
queue<int>q;
for(int i=1;i<=sc;i++)
if(!ru[i]) q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
if(vis[u]==true&&col[u]==1) {
Afail=true;break;
}
if(IsFill&&vis[u]==false&&col[u]==2) {
Afail=true;break;
}
if(!IsFill&&col[u]==2) fill(u),IsFill=true;
for(auto v:T[u]){
if(--ru[v]==0) q.push(v);
}
}
}
void solve(){
inde=0,sc=0;
memset(vis,0,sizeof(vis));
memset(ru,0,sizeof(ru));
IsFill=false,Afail=false;
n=read<int>(),m=read<int>();
for(int i=1;i<=n;i++) G[i].clear(),T[i].clear(),dfn[i]=low[i]=0;
for(int i=1;i<=n;i++) color[i]=read<int>()+1;
for(int i=1;i<=m;i++){
int u=read<int>(),v=read<int>();
add(u,v);
}
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++){
if(col[scc[i]]!=0&&col[scc[i]]!=color[i]) {
putchar('N');
return ;
}
col[scc[i]]=color[i];
}
for(int u=1;u<=n;u++) for(auto v:G[u])
if(scc[u]!=scc[v]) add_T(scc[u],scc[v]);
toposort();
if(!Afail){
putchar('A');
return ;
}
if(!IsFill) {
putchar('B');
return ;
}
if(sc==2&&col[1]==col[2]&&col[1]==2){
putchar('B');
return ;
}
if(sc==2&&((col[1]==1&&!T[1].empty()&&T[1][0]==2)||(col[2]==1&&!T[2].empty()&&T[2][0]==1))){
putchar('B');
return ;
}
putchar('N');
}
int main(){
// freopen("P9220.in","r",stdin);
// freopen("P9220.out","w",stdout);
int T=read<int>();
while(T--) solve();
}