RT
50分WA了,求差错
#include<bits/stdc++.h>
using namespace std;
int n,m,sum[10005],u,v,dfn[10005],cnt,low[10005],total,color[10005],dis[10005];
int in[10005],tp[10005],ans,f[10005],_cnt;
bool vis[10005];
vector<int>ve[10005],from[10005],to[10005];
stack<int>s;
void tarjan(int now) {
dfn[now]=low[now]=++cnt;
s.push(now);
vis[now]=true;
for(int i=0; i<ve[now].size(); i++) {
if(!dfn[ve[now][i]]) {
tarjan(ve[now][i]);
low[now]=min(low[now],low[ve[now][i]]);
} else if(vis[ve[now][i]])
low[now]=min(low[now],dfn[ve[now][i]]);
}
if(low[now]==dfn[now]) {
total++;
while(1) {
int temp=s.top();
color[s.top()]=total;
dis[total]+=sum[s.top()];
vis[s.top()]=false;
s.pop();
if(now==temp)break;
}
}
return;
}
void bfs() {
queue<int>q;
for(int i=1; i<=total; i++)if(!in[i])q.push(i);
while(!q.empty()) {
int y=q.front();
tp[++_cnt]=y;
q.pop();
for(int i=0; i<to[y].size(); i++) {
in[to[y][i]]--;
if(!in[to[y][i]])q.push(to[y][i]);
}
}
return;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)scanf("%d",&sum[i]);
for(int i=1; i<=m; i++) {
scanf("%d%d",&u,&v);
ve[u].push_back(v);
}
for(int i=1; i<=n; i++)if(!dfn[i])tarjan(i);
for(int i=1; i<=n; i++) {
for(int j=0; j<ve[i].size(); i++) {
int x=color[i],y=color[ve[i][j]];
if(x!=y) {
from[y].push_back(x);
to[x].push_back(y);
in[y]++;
}
}
}
bfs();
for(int i=1; i<=total; i++) {
int y=tp[i];
f[y]=dis[y];
ans=max(ans,f[y]);
for(int j=0; j<from[y].size(); j++) {
f[y]=max(f[y],dis[y]+f[from[y][j]]);
ans=max(ans,f[y]);
}
}
printf("%d\n",ans);
}