玄关求调!40pts
查看原帖
玄关求调!40pts
972581
jame0329楼主2025/1/28 14:48
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5,M=1e5+5;
int n,m;
vector<int> dag[N],g[N];
int Belong[N],Besum[N],a[N],times,low[N],dfn[N],col;
bool vis[N];
stack<int> st;
void Tarjan(int u){
	dfn[u]=low[u]=++times;
	st.push(u);vis[u]=1;
	for(int v:g[u]){
		if(!dfn[v]){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[u]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		++col;
		while(1){
			int v=st.top();
			st.pop();
			vis[v]=0;
			Belong[v]=col;
			Besum[col]+=a[v];
			if(v==u) break;
		}
	}
}
int dp[N];
int dfs(int u){
	if(dp[u]!=-1) return dp[u];
	dp[u]=Besum[u];
	for(int v:dag[u]){
		dp[u]=max(dp[u],dp[v]+Besum[u]);
	}
	return dp[u];
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	memset(dp,-1,sizeof(dp));
	for(int i=1; i<=n; i++) cin>>a[i];
	for(int i=1; i<=m; i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
	}
	for(int i=1; i<=n; i++){
		if(!vis[i]) Tarjan(i);
	}
	for(int u=1; u<=n; u++){
		int bu=Belong[u],bv;
		for(int v:dag[u]){
			bv=Belong[v];
			if(bu==bv) continue;
		}
	}
	int ans=0;
	for(int i=1; i<=n; i++) ans=max(ans,dfs(i));
	cout<<ans;
	return 0;
}
2025/1/28 14:48
加载中...