调了一个晚上了,彻底晕了,改来改去都是40分啊w(゚Д゚)w,求救各位大佬!┭┮﹏┭┮
不过1,4,5,9这4个点都是因为输出变成0,也不知道为什么...
#include<bits/stdc++.h>
using namespace std;
#define N 200001
int ne[N],he[N],w[N],to[N],fr[N],k,p[N];
int low[N],ins[N],in[N],dfn[N],cnt,tot;
int ru[N],dis[N],ans;
stack<int> s;
void tarjan(int x){
s.push(x);
ins[x]=1;
low[x]=dfn[x]=++cnt;
for(int i=he[x];i;i=ne[i]){
int t=to[i];
if(!dfn[t]){
tarjan(t);
low[x]=min(low[x],low[t]);
}
else if(ins[x])low[x]=min(low[x],dfn[t]);
}
if(low[x]==dfn[x]){
tot++;
int t;
while(t=s.top()){
ins[t]=0;
in[t]=tot;
p[tot]+=w[t];
s.pop();
if(t==x)break;
}
}
}
int topu(){
queue<int> q;
for(int i=1;i<=tot;i++)if(!ru[i])q.push(i),dis[i]=p[i];
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=he[x];i;i=ne[i]){
int t=to[i];
ru[t]--;
dis[t]=max(dis[x]+p[t],dis[t]);
if(ru[t]==0)q.push(t);
}
}
for(int i=1;i<=tot;i++)if(dis[i]>ans)ans=dis[i];
return ans;
}
void add(int x,int y){
k++;
fr[k]=x;
to[k]=y;
ne[k]=he[x];
he[x]=k;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
k=0;
for(int i=1;i<=m;i++){
int t=in[to[i]],f=in[fr[i]];
if(f!=t){
add(f,t);
ru[t]++;
}
}
//cout<<tot;
cout<<topu();
system("pause");
return 0;
}