题目链接
依据题意,该图可以视为若干个连通块。记dp[i]表示完成第i个点的任务最早结束的时间,那么对于入度为0的点,即没有前置任务,即dp[i]=a[i] 然后顺着链dfs 更新dp值。因为要开始一项任务必须把前置任务都做完,即要取前缀时间的最大值。
const int manx=2e5+5;
const int mamx=4e5+5;
ll head[manx],dp[manx];
ll vis[manx];
ll d[3][manx];
ll k=0;
struct node
{
ll v,next,w;
} a[mamx];
void add(ll u,ll v)
{
a[++k].next=head[u];
// a[k].w=w;
a[k].v=v;
head[u]=k;
}
ll now[manx];
void dfs(ll rt)
{
for(int i=head[rt]; i; i=a[i].next)
{
ll v=a[i].v;
dp[v]=max(dp[v],dp[rt]+now[v]);
dfs(v);
}
}
signed main()
{
ll n,m;
read(n);
read(m);
for(int i=1; i<=n; i++)
{
read(now[i]);
}
for(int i=1; i<=m; i++)
{
ll x,y;
read(x);
read(y);
d[0][x]++; //出度
d[1][y]++; //入度
add(x,y);
}
for(int i=1; i<=n; i++)
{
if(!d[1][i])
dp[i]=now[i],dfs(i);
}
ll ans=0;
for(int i=1; i<=n; i++)
{
ans=max(ans,dp[i]);
}
printf("%lld\n",ans);
}