复健失败,dalao求调!!
#include <bits/stdc++.h>
#define int long long
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007
using namespace std;
inline int read() {
rint x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0){putchar('-');x=-x;}
if(x>9){print(x/10);putchar(x%10+'0');}
else putchar(x+'0');
return;
}
const int N = 1e5 + 10;
struct Node {
int u, v, nx;
} e[N], E[N], EE[N];
int n, m, h[N], H[N], tot, TOT, w[N], dfn[N], low[N], stk[N], top, tim, id[N], in[N], dp[N];
bool instk[N];
void add(int u, int v) {
e[++tot] = (Node){u, v, h[u]};
h[u] = tot;
}
void Add(int u, int v) {
EE[++TOT] = (Node){u, v, H[u]};
H[u] = TOT;
}
void tarjan(int x) {
dfn[x] = low[x] = ++tim;
stk[++top] = x;
instk[x] = 1;
for (int i = h[x]; i; i = e[i].nx) {
int y = e[i].v;
if(!dfn[y]) {
tarjan(y);
low[x] = min(low[x], low[y]);
} else if(instk[y]) {
low[x] = min(low[x], dfn[y]);
}
}
if(dfn[x] == low[x]) {
int y;
while(1) {
y = stk[top--];
instk[y] = 0;
id[y] = x;
if(x == y) break;
w[x] += w[y];
}
}
}
int topu() {
queue<int> q;
For(i,1,n) {
if(!in[i] && id[i] == i) q.push(i), dp[i] = w[i];
}
while(!q.empty()) {
int x = q.front();
q.pop();
for (int i = H[x]; i; i = EE[i].nx) {
int y = EE[i].v;
dp[y] = max(dp[y], dp[x] + w[y]);
if(!(--in[y])) q.push(y);
}
}
int ans = 0;
For(i,1,n) ans = max(ans, dp[i]);
return ans;
}
signed main() {
n = read(), m = read();
For(i,1,n) w[i] = read();
For(i,1,m) {
int u, v;
u = read(), v = read();
E[i].u = u, E[i].v = v;
add(u, v);
}
For(i,1,n) if(!dfn[i]) tarjan(i);
For(i,1,m) {
if(id[E[i].u] != id[E[i].v]) {
Add(E[i].u, E[i].v);
in[E[i].v] ++;
}
}
cout << topu() << '\n';
return 0;
}