.....

我真是个大菜鸡,辣鸡,菜逼....

模版题

将强连通分量缩点,在DAG上DP就行了

然后

(以下是各种智障错误)

因为缩点后新建图

变量名是大写

各种写成小写

加边只加了强连通分量中的一个点

给自己到自己连了条边

在void函数写了个return f[u]

我真是个辣鸡

#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
const int N=1e4+5;
const int M=2e5+5;
int n,m;
struct edge
{
  int to,next;
}e[M],E[M];
int head[N],ecnt,HEAD[N],ECNT,fa[N];
int val[N],sum[N],f[N],ans;
int dfn[N],low[N],ti,id[N];
bool inq[N];
stack<int>stk;
void add(int u,int v)
{
  e[++ecnt].to=v;e[ecnt].next=head[u];head[u]=ecnt;
}
void ADD(int u,int v)
{
  //printf("%d->%d\n",u,v);
  E[++ECNT].to=v;E[ECNT].next=HEAD[u];HEAD[u]=ECNT;id[v]++;
}
void tarjan(int u)
{
  dfn[u]=low[u]=++ti;
  stk.push(u);inq[u]=1;
  for(int i=head[u],v;i;i=e[i].next)
    {
      if(!dfn[v=e[i].to])
    {
      tarjan(v);
      low[u]=min(low[u],low[v]);
    }
      else if(inq[v]) low[u]=min(low[u],dfn[v]);
    }
  if(dfn[u]==low[u])
    {
      int t;
      do
    {
      t=stk.top();
      stk.pop();
      inq[t]=0;
      fa[t]=u;
      sum[u]+=val[t];
    }while(t!=u);
      //printf("%d->%d\n",u,sum[u]);
    }
}
void dfs(int u)
{
  for(int i=HEAD[u],v;i;i=E[i].next)
    {
      dfs(v=E[i].to);
      f[u]=max(f[u],f[v]+sum[u]);
    }
  //printf("%d:%d\n",u,f[u]);
  f[u]=max(f[u],sum[u]);
  ans=max(ans,f[u]);
}
int main()
{
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++) scanf("%d",&val[i]);
  for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),add(u,v);
  for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
  for(int u=1,v;u<=n;u++)
    {
      
      for(int i=head[u];i;i=e[i].next)
    {
      if(fa[u]!=fa[v=e[i].to])
      ADD(fa[u],fa[v]);

    }
    }
  for(int u=1;u<=n;u++)if(fa[u]==u && id[u]==0)dfs(u);
  printf("%d\n",ans);
  return 0;
}