#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
const int INF = 0x3fffffff;
const int maxn = 100010;
void work();
int n, m;
int val[maxn];
vector<int> g[maxn];
int du[maxn];
int d[maxn];
int main()
{
int s, t;
while(scanf("%d%d", &n, &m)!=EOF) {
for(int i = 1; i <= n; i++) g[i].clear();
memset(du, 0, sizeof(du)); // in degree.
for(int i = 1; i <= n; i++) {
scanf("%d", &val[i]);
d[i] = val[i]; // init.
}
for(int i = 1; i <= m; i++) {
scanf("%d%d", &s, &t);
g[s].push_back(t);
du[t]++;
}
work();
}
return 0;
}
queue<int> que;
bool f[maxn]; // first.
void work() {
while(!que.empty()) que.pop();
memset(f, false, sizeof(f));
for(int i = 1; i <= n; i++) {
if(du[i]==0) {
que.push(i);
f[i] = true;
}
}
while(!que.empty()) {
int u = que.front();
que.pop();
for(int i = 0; i < (int)g[u].size(); i++) {
int v = g[u][i];
if(f[v]==false && f[u]==true) { // first.
d[v] = d[u]+val[v];
f[v] = true;
}
if(f[v]==true && f[u]==true) {
d[v] = max(d[v], d[u]+val[v]);
}
du[v]--;
if(du[v]==0) que.push(v);
}
}
int ans = -INF;
for(int i = 1; i <= n; i++) {
int len = (int)g[i].size();
if(len==0) {
ans = max(ans, d[i]);
}
}
printf("%d\n", ans);
}
记忆化搜索
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
const int INF = 0x3fffffff;
const int maxn = 100010;
int val[maxn];
vector<int> g[maxn];
int d[maxn];
bool vis[maxn];
vector<int> start;
vector<int> des;
int du[maxn];
int n, m;
int s, t;
int dfs(int v) {
if(vis[v]) return d[v];
int ans = -INF;
for(int i = 0; i < (int)g[v].size(); i++) {
int tmp = dfs(g[v][i]);
ans = max(ans, tmp);
}
vis[v] = true;
d[v] = ans + val[v];
return d[v];
}
void init() {
memset(vis, false, sizeof(vis));
for(int i = 1; i <= n; i++) {
d[i] = -INF;
}
for(int i = 1; i <= n; i++) {
if(du[i]==0) start.push_back(i);
}
for(int i = 1; i <= n; i++) {
int k = (int)g[i].size();
if(k==0) des.push_back(i);
}
for(int i = 0; i < (int)des.size(); i++) {
int v = des[i];
d[v] = val[v];
vis[v] = true;
}
}
int main()
{
while(scanf("%d%d", &n, &m)!=EOF) {
for(int i = 1; i <= n; i++) g[i].clear();
start.clear();
des.clear();
memset(du, 0, sizeof(du));
for(int i = 1; i <= n; i++) {
scanf("%d", &val[i]);
}
for(int i = 1; i <= m; i++) {
scanf("%d%d", &s, &t);
g[s].push_back(t);
du[t]++;
}
init();
int ans = -INF;
for(int i = 0; i < (int)start.size(); i++) {
ans = max(ans, dfs(start[i]));
}
printf("%d\n", ans);
}
return 0;
}