P3387 【模板】缩点
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int head[N],headg[N],dfn[N],low[N],belong[N];
int sta[N],top;
int cnt,tot;
int n,m,sum[N];
int a[N];
//int s[N];
int l,l2;
int dp[N];
bool vis[N];
struct edge{
int from;
int to;
int ne;
}e[N<<1],g[N<<1];
void add(int u,int v){
e[++l].from=u;
e[l].to=v;
e[l].ne=head[u];
head[u]=l;
}
void add1(int u,int v){
g[++l2].from=u;
g[l2].to=v;
g[l2].ne=headg[u];
headg[u]=l2;
}
void tarjan(int now){
dfn[now]=low[now]=++cnt;
vis[now]=1;
sta[++top]=now;
for(int i=head[now];i;i=e[i].ne){
int n=e[i].to;
if(!dfn[n]){
tarjan(n);
low[now]=min(low[now],low[n]);
} else if(vis[n]){
low[now]=min(low[now],dfn[n]);
}
}
if(dfn[now]==low[now]){
++tot;
while(sta[top+1]!=now){
int v=sta[top];
belong[v]=tot;
vis[v]=0;
sum[tot]+=a[sta[top--]];
}
}
}
void dfs(int u){
if(dp[u])return ;
dp[u]=sum[u];
for(int i=headg[u];i;i=g[i].ne){
int v=g[i].to;
dfs(v);
dp[u]=max(dp[u],dp[v]+sum[u]);
}
}
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++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
//l=0;
for(int i=1;i<=m;i++){
int u=e[i].from;
int v=e[i].to;
if(belong[u]!=belong[v]){
add1(belong[u],belong[v]);
}
}
int ans=0;
for(int i=1;i<=tot;i++){
if(!dp[i]){
dfs(i);
ans=max(ans,dp[i]);
}
}
printf("%d
",ans);
return 0;
}