萌新刚学OI半秒,代码能AC,O2全RE是怎么回事?
查看原帖
萌新刚学OI半秒,代码能AC,O2全RE是怎么回事?
279095
gargantuar楼主2021/6/20 19:12

RT

#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int head[10086],v[10086];
int headn[10086],vn[10086],dn[10005],low[10086],cont,st[10086],sd[10086],in[10005],out[10005],top,tim,anss,n,m;
bool book[10086],stm[10086];
struct li {
	int to,next;
} e[100005],en[100005];
int add(int s,int t) {
	e[++cont].to=t;
	e[cont].next=head[s];
	head[s]=cont;
}
int Nadd(int s,int t) {
	en[++cont].to=t;
	en[cont].next=headn[s];
	headn[s]=cont;
}
int tarjan(int a) {
	dn[a]=low[a]=++tim;
	st[++top]=a;
	stm[tim]=1;
	int ak;
	for(int i=head[a]; i; i=e[i].next) {
		ak=e[i].to;
		if(!dn[ak]) {
			tarjan(ak);
			low[a]=min(low[a],low[ak]);
		} else if(stm[low[ak]]) {
			low[a]=min(low[a],low[ak]);
		}
	}
	if(dn[a]==low[a]) {
		sd[a]=a;
		while(ak=st[top--]) {
			stm[dn[ak]]=0;
			if(a==ak)break;
			v[a]+=v[ak];
			sd[ak]=a;
		}
	}
}
int topo() {
	queue<int>q;
	for(int i=1; i<=n; ++i) {
		if(sd[i]==i&&!in[i]) {
			q.push(i);
		}
		vn[i]=v[i];
	}
	anss=vn[q.front()];
	while(!q.empty()) {
		int th=q.front();
		int ak;
		q.pop();
		for(int i=headn[th]; i; i=en[i].next) {
			ak=en[i].to;
			--in[ak];
			if(!in[ak]) {
				vn[ak]+=vn[th];
				if(!out[ak])anss=max(anss,vn[ak]);
				else q.push(ak);
			}
		}
	}
}
int main() {
	scanf("%d%d",&n,&m);
	int ls,lss;
	for(int i=1; i<=n; ++i) {
		scanf("%d",&v[i]);
	}
	for(int i=1; i<=m; i++) {
		scanf("%d%d",&ls,&lss);
		add(ls,lss);
	}
	for(int i=1; i<=n; ++i)if(!dn[i])tarjan(i);
	cont=0;
	for(int i=1; i<=n; ++i) {
		for(int j=head[i]; j; j=e[j].next) {
			ls=sd[i],lss=sd[e[j].to];
			if(ls==lss)continue;
			Nadd(ls,lss);
			++in[lss];
			++out[ls];
		}
	}
	topo();
	printf("%d",anss);
	return 0;
}
2021/6/20 19:12
加载中...