经测试,maxn 必须开到 105 才能避免 RE,但题面的 n 是满足 n≤104。(本人因为这个调了半小时)
附代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10, MAXM = 1e5 + 10;
int n, m, head[MAXN], ans, cnt, _head[MAXN], _cnt, a[MAXN], vis[MAXN], low[MAXN], dfn[MAXN], tot, f[MAXN], prt[MAXN], num, c[MAXN], U[MAXN], V[MAXN], in[MAXN];
struct Edge{
int to, nxt;
}e[MAXM], _e[MAXM];
void add(int u, int v){
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
}
void _add(int u, int v){
_e[++_cnt].nxt = _head[u];
_head[u] = _cnt;
_e[_cnt].to = v;
}
stack <int> st;
void tarjan(int u){
low[u] = dfn[u] = ++tot;
st.push(u);
vis[u] = 1;
for(int i = head[u]; ~i; i = e[i].nxt){
int v = e[i].to;
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(vis[v])
low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]){
int v;
do{
v = st.top();
st.pop();
prt[v] = u;
vis[v] = 0;
c[u] += a[v];
}while(v != u);
}
}
void topo(){
queue <int> q;
for(int i = 1; i <= n; i++)
if(in[i] == 0 && prt[i] == i)
q.push(i), f[i] = c[i];
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = _head[u]; ~i; i = _e[i].nxt){
int v = _e[i].to;
in[v]--;
f[v] = max(f[v], f[u] + c[v]);
if(!in[v])
q.push(v);
}
}
}
int main(){
memset(head, -1, sizeof(head));
memset(_head, -1, sizeof(_head));
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", a + i);
for(int i = 1; i <= m; i++){
scanf("%d %d", U + i, V + i);
add(U[i], V[i]);
}
for(int i = 1; i <= n; i++)
if(!dfn[i])
tarjan(i);
for(int i = 1; i <= m; i++){
if(prt[U[i]] != prt[V[i]])
_add(prt[U[i]], prt[V[i]]), in[prt[V[i]]]++;
}
topo();
for(int i = 1; i <= n; i++)
ans = max(f[i], ans);
printf("%d", ans);
return 0;
}