思路就是Tarjan+Topsort+dp,交上去就只有60分,不知道哪错了,求大佬调一调!
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int val[N],wval[N];
int n,m,cnt=0,st[N],low[N],dfn[N],id[N],ind[N],dist[N];
vector<int> G[N];
vector<int> T[N];
bool in[N];
void tarjan(int x)
{
static int num=0,top=0;
dfn[x]=low[x]=++num;
st[++top]=x;in[x]=1;
for(int y:G[x])
{
if(dfn[y]==0)
{
tarjan(y);
low[x]=min(low[x],low[y]);
}
else
{
if(in[y])
{
low[x]=min(low[x],dfn[y]);
}
}
}
int y;
if(low[x]==dfn[x])
{
cnt++;
do{
y=st[top--];
id[y]=cnt;
wval[cnt]+=val[y];
in[y]=0;
}while(y!=x);
}
}
int topsort()
{
int ans=-1;
queue<int> Q;
for(int i=1;i<=cnt;i++)
{
dist[i]=wval[i];
if(ind[i]==0) Q.push(i);
}
while(!Q.empty())
{
int x=Q.front();Q.pop();
for(int i=0;i<T[x].size();i++)
{
int y=T[x][i];
dist[y]=max(dist[y],wval[x]+wval[y]);
if(ind[y]>0) ind[y]--;
if(ind[y]==0) Q.push(y);
}
}
for(int i=1;i<=n;i++)
{
ans=max(ans,dist[i]);
}
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
G[x].push_back(y);
}
for(int i=1;i<=n;i++)
{
if(dfn[i]==0) tarjan(i);
}
for(int i=1;i<=n;i++)
{
for(int y:G[i])
{
if(id[i]==id[y]) continue;
T[id[i]].push_back(id[y]);
ind[id[y]]++;
}
}
printf("%d",topsort());
}