```c
#include<bits/stdc++.h>
using namespace std;
#define N 1000010
#define ll long long
vector<ll> g[N],gnew[N];
ll color[N],vis[N],dfn[N],st[N],low[N],cnt[N],p[N],f[N];
ll ind[N],outd[N],num[N];
ll ix,top,sum,res=0,n,m,ans;
void tarjan(ll v)
{
dfn[v]=++ix;
low[v]=ix;
vis[v]=1;
st[++top]=v;
for(ll i=0;i<g[v].size();++i)
{
ll id=g[v][i];
if(!dfn[id])
{
tarjan(id);
low[v]=min(low[v],low[id]);
}
else
{
if(vis[id])
{
low[v]=min(low[v],low[id]);
}
}
}
if(low[v]==dfn[v])
{
color[v]=++sum;num[sum]+=p[v];
vis[v]=0;
while(st[top]!=v)
{
color[st[top]]=sum;
vis[st[top--]]=0;
num[sum]+=p[st[top]];
}
top--;
}
}
void search(int x)
{
if(f[x]) return ;
f[x]=num[x];
ll maxsum=0;
for(int i=0;i<gnew[x].size();++i)
{
if(!f[gnew[x][i]])
search(f[gnew[x][i]]);
maxsum=max(maxsum,f[gnew[x][i]]);
}
f[x]+=maxsum;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%lld",&p[i]);
}
for(int i=1;i<=m;++i)
{
ll x,y;
scanf("%lld%lld",&x,&y);
g[x].push_back(y);
}
for(ll i=1;i<=n;++i)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;++i)
{
for(ll k=0;k<g[i].size();++k)
{
ll v=g[i][k];
if(color[v]!=color[i])
{
gnew[i].push_back(color[k]);
}
}
}
for(int i=1;i<=sum;i++){
if(!f[i]){
search(i);
ans=max(ans,f[i]);
}
}
printf("%d",ans);
return 0;
}
```
记忆化搜索也g了
by hfyzyhlez @ 2022-10-19 17:10:58
@[hfyzyhlez](/user/70674)
1. ~~`index`是怎么过编的~~
2.
```cpp
while(st[top]!=v)
{
color[st[top]]=sum;
vis[st[top--]]=0;
num[sum]+=p[st[top]];
}
```
这里`top--`要放在最后
3.
```cpp
for(int i=1;i<=n;++i)
{
for(ll k=0;k<g[i].size();++k)
{
ll v=g[i][k];
if(color[v]!=color[i])
{
gnew[i].push_back(color[k]);
index[color[k]]++;
}
}
}
```
这一段及其混乱,变量名基本搞混了(以及加边时都是`color[...]`)。
by World_Creater @ 2022-10-19 17:46:24
LEZ巨,竟然在写缩点!
------------
但言归正传,思路确实一如往常的混乱,用脚趾头想想也知道,BUG不知道有多少,实在不想调,看看楼上红名大佬的指点吧
by AK_SLS @ 2022-10-19 22:49:34