MnZn秋调简单博弈论(玄关)
查看原帖
MnZn秋调简单博弈论(玄关)
311306
dk_qwq楼主2024/9/25 18:27

秋秋辣,调了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();
}
2024/9/25 18:27
加载中...