P3387 【模板】缩点
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\n",ans); return 0; }