40pts玄关求调
查看原帖
40pts玄关求调
986624
mengmeng123456楼主2024/7/21 11:48
#include<bits/stdc++.h>
using namespace std;
const int N=100005,M=5*N;
int n,m;
int a[N];
int hd[N],nxt[M],to[M],tot;
int hd2[N],nxt2[M],to2[M],tot2,rd[N];
int st[N],idx,dfn[N],low[N],ins[N],cnt;
int dis[N];
int ans=0,res;
int tup[N],cntt;
int b[N];
int dp[N];
void add(int x,int y){
	tot++;
	to[tot]=y;
	nxt[tot]=hd[x];
	hd[x]=tot;
}
void add2(int x,int y){
	tot2++;
	to2[tot2]=y;
	nxt2[tot2]=hd2[x];
	hd2[x]=tot2;
	rd[y]++;
}
void Tarjan(int now){
	dfn[now]=++cnt;
	low[now]=cnt;
	st[++idx]=now;
	ins[idx]=1;
	for(int i=hd[now];i;i=nxt[i]){
		int v=to[i];
		if(!dfn[v]){
			Tarjan(v);
			low[now]=min(low[now],low[v]);
		}
		else if(ins[v]){
			low[now]=min(low[now],dfn[v]);
		}
	}
	if(low[now]==dfn[now]){
		res++;
		do{
			int aaa=st[idx--];
			ins[aaa]=0;
			dis[res]+=a[aaa];
			b[aaa]=res;
		}while(st[idx]!=now&&idx>=1);
		int aaa=st[idx--];
		ins[aaa]=0;
		dis[res]+=a[aaa];
		b[aaa]=res;
	}
}
void topo(){
	queue<int>s;
	for(int i=1;i<=res;i++){
		if(rd[i]==0){
			s.push(i);
		}
	}
	while(!s.empty()){
		int aaa=s.front();
		tup[++cntt]=aaa;
		s.pop();
		for(int i=hd[aaa];i;i=nxt[i]){
			int v=to[i];
			if(rd[v]>0){
				rd[v]--;
				if(rd[v]==0){
					s.push(v);
				}
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[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 i=1;i<=n;i++){
		for(int j=hd[i];j;j=nxt[j]){
			if(b[i]!=b[j]){
				add2(b[i],b[j]);
			}
		}
	}
	topo();
	for(int i=1;i<=cntt;i++){
		int u=tup[i];
		dp[u]=dis[u];
		for(int j=hd[u];j;j=nxt[j]){
			int v=to[j];
			dp[v]=max(dp[v],dp[u]+dis[v]);
		}
	}
	for(int i=1;i<=cntt;i++){
		ans=max(ans,dp[i]);
	}
	cout<<ans;
	return 0;
}
2024/7/21 11:48
加载中...