#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=200010;
int n,m;
int dp[N];
int h[N],e[M],ne[M],v[N],idx;
int d[N];
void add(int a,int b)
{
e[++idx]=b;
ne[idx]=h[a];
h[a]=idx;
}
void topsort()
{
queue<int> que;
que.push(0);
while(!que.empty())
{
int head=que.front();
que.pop();
for(int i=h[head];i!=-1;i=ne[i])
{
int j=e[i];
dp[j]=max(dp[j],dp[head]+v[j]);
if(--d[j]==0)
que.push(j);
}
}
}
int main()
{
memset(h,-1,sizeof(h));//重要
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>v[i];
while(m--)
{
int a,b;
cin>>a>>b;
add(a,b);
d[b]++;
}
topsort();
cout<<dp[n];
return 0;
}
拓扑DP——来自wzc的简单拓扑dp
于 2022-03-18 17:04:53 首次发布