社区讨论

求调,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 条回复,欢迎继续交流。

正在加载回复...