编辑
2025-08-30
XCPC
00
请注意,本文编写于 141 天前,最后修改于 141 天前,其中某些信息可能已经过时。
#include<bits/stdc++.h> using namespace std; #define int long long const int M=2e5+5; int a[M],dp[M],in[M],cn,cnt,sta[M],low[M],dfn[M],sum[M]; vector<int>f[M],ff[M]; int top,belong[M]; void dfs(int now) { dfn[now]=low[now]=++cn; sta[++top]=now; in[now]=1; for(auto to:f[now]) if(!dfn[to])dfs(to),low[now]=min(low[now],low[to]); else if(in[to])low[now]=min(low[now],dfn[to]); if(dfn[now]==low[now]) { ++cnt; int y; do { y=sta[top--]; in[y]=0; sum[cnt]+=a[y]; belong[y]=cnt; } while(now!=y); } } int ru[M],chu[M]; void solve() { int n,m; cin>>n>>m; for(int i=1; i<=n; ++i)cin>>a[i]; while(m--) { int x,y; cin>>x>>y; f[x].push_back(y); } for(int i=1; i<=n; ++i)if(!dfn[i])dfs(i); for(int i=1; i<=n; ++i) for(auto to:f[i]) if(belong[i]!=belong[to]) ru[belong[to]]++,chu[belong[i]]++,ff[belong[i]].push_back(belong[to]); queue<int>p; for(int i=1; i<=cnt; ++i) { dp[i]=sum[i]; if(ru[i]==0)p.push(i); } while(!p.empty()) { int t=p.front(); p.pop(); for(auto to:ff[t]) { dp[to]=max(dp[to],sum[to]+dp[t]); if(!--ru[to])p.push(to); } } int ans=0; for(int i=1; i<=n; ++i)ans=max(ans,dp[i]); cout<<ans; } signed main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int t=1; //cin>>t; while(t--)solve(); return 0; }
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay