1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| const int N = 2e4; int n, m, a[N], mark[N], t[N]; vi rim[N], nrim[N], dfn; bitset<10086> vis; set<int> s[N]; LL dp[N];
void dfs(int x) { vis[x] = 1; for (auto it : rim[x]) { if (!vis[it]) dfs(it); } dfn.pb(x); } int cnt; void dfs1(int x) { mark[x] = cnt, t[cnt] += a[x]; for (auto it : nrim[x]) { if (!mark[it]) dfs1(it); } } inline void df(int x) { if(dp[x]) return ; for(auto it:s[x]){ df(it); dp[x]=max(dp[x],dp[it]); } dp[x]+=t[x]; }
int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; f(i, 1, n) cin >> a[i]; f(i, 1, m) { int x, y; cin >> x >> y; rim[x].pb(y); nrim[y].pb(x); } vis.reset(); f(i, 1, n) { if (!vis[i]) dfs(i); } vis.reset(); for (auto it = dfn.rbegin(); it != dfn.rend(); it++) { if (!mark[*it]) { cnt+=1; dfs1(*it); } } f(i, 1, n) { for (auto it : rim[i]) { if (mark[i] != mark[it]) s[mark[i]].insert(mark[it]); } } LL ans = 0; f(i, 1, cnt ) { df(i); ans = max(ans, dp[i]); } cout << ans; return 0; }
|