#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int f[100009];
struct node
{
int from,to,next;
};
node edge[1000009];
int w[100009];
int head[100009];
int num;
void add(int from,int to)
{
edge[++num].next=head[from];
edge[num].from=from;
edge[num].to=to;
head[from]=num;
}
stack<int> s;
int in[100009];
int out[100009];
int main()
{
int m,n;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
f[i]=-0x7fffffff;
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
out[x]++;
in[y]++;
}
for(int i=1;i<=n;i++)
if(in[i]==0)
{
f[i]=w[i];
s.push(i);
}
int I=0;
while(I!=n)
{
int u=s.top();
s.pop();
I++;
for(int i=head[u];i!=0;i=edge[i].next)
{
in[edge[i].to]--;
f[edge[i].to]=max(f[u]+w[edge[i].to],f[edge[i].to]);
if(in[edge[i].to]==0)
{
s.push(edge[i].to);
in[edge[i].to]=0x7fffffff;
}
}
}
int ans=-0x7fffffff;
for(int i=1;i<=n;i++)
if(out[i]==0)
ans=max(ans,f[i]);
printf("%d",ans);
return 0;
}
test for job
最新推荐文章于 2021-05-07 09:09:42 发布