rt,又WA又T
离谱的是直接输出dfn都不是0
强行改成0后好像会RE
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,u[10005],v[10005],e_cnt,e_head[10005],suo_cnt,suo_head[10005],in[10005];
int a[10005],dis[10005];
int dfn[10005],low[10005],zhan[10005],tp,dfncnt,is_in[10005];
int scc[10005],siz[10005],sum;
struct node{
int to,nxt;
}e[100005],suo[100005];
void e_add(int u,int v){
e[++e_cnt].to=v;
e[e_cnt].nxt=e_head[u];
e_head[u]=e_cnt;
}
void suo_add(int u,int v){
suo[++suo_cnt].to=v;
suo[suo_cnt].nxt=suo_head[u];
suo_head[u]=suo_cnt;
}
void tarjan(int x){
dfn[x]=low[x]=++dfncnt;
is_in[x]=1,zhan[++tp]=x;
for(int i=e_head[x];i;i=e[i].nxt){
int y=e[i].to;
if(dfn[y]==0){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(is_in[y]==1){
low[x]=min(low[x],dfn[y]);
//low[x]=min(low[x],low[y]);
}
}
if(low[x]==dfn[x]){
int y;
while(y=zhan[tp--]){
scc[y]=x;
is_in[y]=0;
if(x==y) break;
a[x]=a[x]+a[y];
}
}
}
int topo(){
queue<int> Q;
for(int i=1;i<=n;i++){
//cout <<a[i]<<endl;
if(scc[i]==i&&in[i]==0){
Q.push(i);
dis[i]=a[i];
}
}
while(!Q.empty()){
int qwq=Q.front();
Q.pop();
for(int i=suo_head[qwq];i;i=suo[i].nxt){
int to=suo[i].to;
dis[to]=max(dis[to],dis[qwq]+a[to]);
in[to]--;
if(in[to]==0){
Q.push(to);
}
}
}
int answer=-1;
for(int i=1;i<=n;i++){
answer=max(answer,dis[i]);
}
return answer;
}
int main(){
//freopen("P3387_2.in","r",stdin);
//memset(dfn,0,sizeof(dfn));
cin >>n>>m;
for(int i=1;i<=n;i++){
cin >>a[i];
}
for(int i=1;i<=m;i++){
cin >>u[i]>>v[i];
e_add(u[i],v[i]);
}
for(int i=1;i<=n;i++){
//dfn[i]=0;
cout <<dfn[i]<<" ";
}
for(int i=1;i<=n;i++){
if(dfn[i]==0){
tarjan(i);
//cout <<i<<"tarjan";
}
}
for(int i=1;i<=m;i++){
int x=scc[u[i]],y=scc[v[i]];
//cout <<i<<" "<<x<<" "<<y<<endl;
if(x!=y){
suo_add(x,y);
in[y]++;
}
}
cout <<topo();
return 0;
}