题意:求从入度为0的点到出度为0的点的路上的权值最大之和。
思路:拓扑排序,注意,孤立点。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N = 100009;
const int M = 1000009;
const int INF = 0x3f3f3f3f;
int n,m;
struct LT{
int nex,to;
} L[M];
int F[N],cnt;
void add(int f,int t)
{
L[cnt].nex = F[f];
L[cnt].to = t;
F[f] =cnt++;
}
int val[N];
int in[N];
int sum[N];
queue<int> que;
void init()
{
for(int i=1;i<=n;i++) scanf("%d",&val[i]),sum[i]=-INF;
int f,t;
memset(F,0,sizeof(F)),cnt=1;
memset(in,0,sizeof(in));
for(int i=0;i<m;i++) scanf("%d%d",&f,&t),add(f,t),in[t]++;
}
void solve()
{
int ans = -INF;
while(!que.empty()) que.pop();
for(int i=1;i<=n;i++)
if(in[i]==0){
que.push(i),sum[i]=val[i];
if(F[i]==0) ans=max(ans,sum[i]);///孤立点
}
while(!que.empty())
{
int e = que.front();que.pop();
for(int i=F[e];i;i=L[i].nex)
{
int to = L[i].to;
sum[to]=max(sum[to],sum[e]+val[to]);
in[to]--;
if(!in[to]) que.push(to);
if(F[to]==0) ans = max(ans,sum[to]);
}
}
printf("%d\n",ans);
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
init();
solve();
}
return 0;
}