社区讨论
求调,Subtask 4 WA 前三个
P9220「TAOI-1」椎名真昼参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo1tirrq
- 此快照首次捕获于
- 2023/10/23 02:44 2 年前
- 此快照最后确认于
- 2023/11/03 03:18 2 年前
RT,悬赏互关!
CPP#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
const int N=100005;
int T,n,m,a,b,c[N],black;
vector <int> E[N],e[N];
int dfn[N],low[N],col[N],point[N],dfnum,colnum,in[N];
bool ins[N],same=true,allblack_from=true;
stack <int> S;
void Tarjan(int u){
dfn[u]=low[u]=++dfnum;
S.push(u);ins[u]=true;
for(int i=0;i<E[u].size();i++){
int v=E[u][i];
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(ins[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
ins[u]=false;
col[u]=++colnum;point[colnum]=c[u];
while(S.top()!=u){
ins[S.top()]=false;
col[S.top()]=colnum;
same&=(point[colnum]==c[S.top()]);
S.pop();
}
S.pop();
}
}
int Toposort(){
queue <int> Q;
for(int i=1;i<=colnum;i++)
if(!in[i]) Q.push(i);
while(!Q.empty()){
int u=Q.front();Q.pop();
if(point[u]) return u;
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
in[v]--;
if(!in[v]) Q.push(v);
}
}
return -1;
}
void DFS(int u){
black-=point[u];
allblack_from&=point[u];
for(int i=0;i<e[u].size();i++)
DFS(e[u][i]);
}
int main(){
scanf("%d",&T);
while(T--){
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(col,0,sizeof(col));
memset(ins,false,sizeof(ins));
memset(in,0,sizeof(in));
for(int i=1;i<=n;i++) E[i].clear(),e[i].clear();
colnum=dfnum=black=0;allblack_from=same=true;
while(!S.empty()) S.pop();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&c[i]);
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
E[a].push_back(b);
}
for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
bool flag=false,BtoW=(colnum==2),TowB=(colnum==2);
for(int i=1;i<=colnum;i++) TowB&=point[i],black+=point[i];
if(!same) printf("N");
else{
for(int i=1;i<=n;i++)
for(int j=0;j<E[i].size();j++)
if(col[i]!=col[E[i][j]]){
e[col[i]].push_back(col[E[i][j]]);
in[col[E[i][j]]]++;
BtoW&=(point[col[i]]&&(!point[col[E[i][j]]]));
}
int from=Toposort();
if(from==-1){
printf("B");
continue;
}
DFS(from);
if(allblack_from&&black==0) printf("A");
else{
if(BtoW||TowB) printf("B");
else printf("N");
}
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...