萌新40分求助
查看原帖
萌新40分求助
247359
WuhenGSL楼主2020/8/15 11:06
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define N 100100
#define M 1000100
using namespace std;
int n,m;
int Root[N],Next[N],v[M],cnt;
int a[N],s[N],top,dfn[N],low[N],scc[N],dfscnt,scccnt;
int q[N],r[N],tail;	
int X[N],Y[N],f[N];
inline void add(int _u,int _v)
{
	v[++cnt]=_v;
	Next[cnt]=Root[_u];
	Root[_u]=cnt;
}
inline void tarjan(int u)
{
	dfn[u]=low[u]=++dfscnt;
	s[top++]=u;
	for(int x=Root[u];x!=0;x=Next[x]){
		if(!dfn[v[x]]){
			tarjan(v[x]);
			low[u]=min(low[v[x]],low[u]);
		}else if(!scc[v[x]])low[u]=min(low[u],dfn[v[x]]);
	}
	if(dfn[u]==low[u]){
		scccnt++;
		do{
			scc[s[--top]]=scccnt;
			if(s[top]!=u)a[scccnt]+=a[s[top]];
		}while(s[top]!=u);
	}
}
int topo()
{
	tail=0;
	for(int i=1;i<=scccnt;++i)
		if(r[i]==0)q[++tail]=i,f[i]=a[i];
	for(int head=1;head<=tail;++head){
		int u=q[head];
		for(int x=Root[u];x!=0;x=Next[x]){
			f[v[x]]=max(f[v[x]],f[u]+a[v[x]]);
			r[v[x]]--;
			if(r[v[x]]==0)q[++tail]=v[x];
		}
	}
	int ans=0;
	for(int i=1;i<=scccnt;++i)ans=max(ans,f[i]);
	return ans;
}
int main()
{
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;++i)scanf("%d",&a[i]);
	for(int i=1;i<=m;++i){
		scanf("%d %d",&X[i],&Y[i]);
		add(X[i],Y[i]);
	}
	for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i);
	memset(Root,0,sizeof Root);
	memset(Next,0,sizeof Next);
	memset(v,0,sizeof v);
	cnt=0;
	for(int i=1;i<=m;++i)
		if(scc[X[i]]!=scc[Y[i]]){
			add(scc[X[i]],scc[Y[i]]);
			r[scc[Y[i]]]++;
		}
	printf("%d",topo());
	return 0;
}
2020/8/15 11:06
加载中...