40pts 记搜拓扑 求调
查看原帖
40pts 记搜拓扑 求调
504403
VDLevUp楼主2023/9/7 19:03

rt

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e4+10,M=1e5+10;
int ans=-0x3f3f3f3f;
int cnt,n,m,head[N],nxt[M],from[M],to[M],v[N];
namespace answer{
	int cnt,n,m,head[N],nxt[M],to[M],in[N];
}
void add2(const int u,const int v){
	answer::nxt[++answer::cnt]=answer::head[u];
	answer::to[answer::cnt]=v;
	answer::head[u]=answer::cnt;
}
int dfn[N],low[N],stk[N],tp,inStk[N],timer;
int scc[N],sc;
void add(const int u,const int v){
	nxt[++cnt]=head[u];
	from[cnt]=u;
	to[cnt]=v;
	head[u]=cnt;
}
void TarjanSCC(int u){
	dfn[u]=low[u]=++timer;
	stk[++tp]=u;
	inStk[u]=1;
	for(int i=head[u];i;i=nxt[i])
		if(!dfn[to[i]])
			TarjanSCC(to[i]),
			low[u]=min(low[u],low[to[i]]);
		else if(inStk[to[i]])
			low[u]=min(low[u],low[to[i]]);
	if(dfn[u]==low[u]){
		sc++;
		while(stk[tp]!=u){
			v[u]+=v[stk[tp]];
			scc[stk[tp]]=sc;
			inStk[stk[tp--]]=0;
		}
		scc[stk[tp]]=sc;
		inStk[stk[tp--]]=0;
	}
}
int f[N];
int topsort(int u){
	if(f[u])
		return f[u];
	f[u]=v[u];
	for(int i=answer::head[u];i;i=answer::nxt[i])
		f[u]=max(f[u],topsort(answer::to[i])+v[i]);
	return f[u];
}
int dfs(int u){
	int t=1;
	for(int i=answer::head[u];i;i=answer::nxt[i])
		t=max(t,dfs(answer::to[i])+1);
	return t;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",v+i);
	for(int i=1,u,v;i<=m;i++)
		scanf("%d%d",&u,&v),
		add(u,v);
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			TarjanSCC(i);
	for(int i=1;i<=cnt;i++){
		if(scc[from[i]]!=scc[to[i]]){
			add2(from[i],to[i]);
			answer::in[to[i]]++;
		}
	} 
	for(int i=1;i<=n;i++)
		if(answer::in[i]==0)
			ans=max(ans,topsort(i));
	printf("%d",ans);
	return 0;
}
2023/9/7 19:03
加载中...