如题,题解里都是邻接表不太好对照
#include<bits/stdc++.h>
using namespace std;
#define N 1000010
#define ll long long
vector<ll> g[N],gnew[N];//gnew存缩点后新建的图
ll color[N],vis[N],dfn[N],st[N],low[N],p[N],f[N],S[N];//color存tarjan后的点
ll num[N],index[N];//index入度
ll ix,top,sum,res=0,n,m,ans,tot;
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--;
}
}
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]);
index[color[k]]++;
}
}
}
for(int i=1;i<=sum;++i)
{
if(!index[i])
{
S[++tot]=i;
f[i]=num[i];
}
}
while(tot)
{
int x=S[tot--];
for(int i=0;i<gnew[x].size();++i)
{
int y=gnew[x][i];
f[y]=max(f[y],f[x]+num[y]);
if(--index[y]==0)
{
S[++tot]=y;
}
}
}
ll ans=0;
for(int i=1;i<=sum;++i)
{
ans=max(ans,f[i]);
}
cout<<ans<<endl;
return 0;
}