萌新求助!
查看原帖
萌新求助!
223392
Belarus楼主2020/10/25 10:41

80分,不知道哪里错了qaq

#include<bits/stdc++.h>
using namespace std;
const int size=1000010;
int n,m,tot=1,num,cnt,top;
int ver[size],nxt[size],head[size];
int stk[size],dfn[size],low[size],ins[size],ind[size],inq[size];
int hc[size],vc[size],nc[size],tc=1;
int d[size],w[size],c[size],p[size];
int ans=0;
inline void add(int x,int y){
	ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
inline void cadd(int x,int y){
	vc[++tc]=y,nc[tc]=hc[x],hc[x]=tc;
}
void tarjan(int x){
	dfn[x]=low[x]=++num;
	stk[++top]=x,ins[x]=1;
	for(int i=head[x];i;i=nxt[i]){
		int y=ver[i];
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(ins[y]) low[x]=min(low[x],dfn[y]);
	}
	if(low[x]==dfn[x]){
		cnt++;int y;
		do{
			y=stk[top--];
			c[y]=cnt;
			ins[y]=0;
			w[cnt]+=p[y];
		}while(x!=y);
	}
}
queue<int> q;
int main(){
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>p[i];
	for(int i=1;i<=m;++i){
		int x,y;
		cin>>x>>y;
		add(x,y);
	}
	for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
	for(int x=1;x<=n;++x)
	 for(int i=head[x];i;i=nxt[i]){
	 	int y=ver[i];
	 	if(c[x]==c[y]) continue;
	 	cadd(c[x],c[y]);
	 	ind[y]++;
	 }
	for(int i=1;i<=cnt;++i) d[i]=-0x3f3f3f3f;
	for(int i=1;i<=cnt;++i) d[i]=w[i];
	for(int i=1;i<=cnt;++i) if(!ind[i]) q.push(i),inq[i]=1,d[i]=w[i];
	while(!q.empty()){
		int x=q.front();q.pop();
		inq[x]=0;
		for(int i=hc[x];i;i=nc[i]){
			int y=vc[i];
			if(d[y]<d[x]+w[y]){
				d[y]=d[x]+w[y];
				if(!inq[y]) inq[y]=1,q.push(y);
			}
		}
	}
	for(int i=1;i<=cnt;++i) ans=max(ans,d[i]);
	cout<<ans<<endl;
	return 0;
}
2020/10/25 10:41
加载中...