经测试,正常的 tarjan 能通过 hack 数据
但是 kosaraju 在 hack 数据上超时了
不知道是算法本身的问题还是我的 kosaraju 写错了
求指出超时的原因,玄 1 关,先到先得
我的 kosarju:
#include<bits/stdc++.h>
#define Code using
#define by namespace
#define wjb std
Code by wjb;
int in()
{
int k=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
return k*f;
}
void out(int x)
{
if(x<0)putchar('-'),x=-x;
if(x<10)putchar(x+'0');
else out(x/10),putchar(x%10+'0');
}
const int N=1e5+10;
vector<int>e[N],e2[N];
bool vis[N];vector<int>s;
void dfs1(int u)
{
vis[u]=true;
for(int v:e[u])if(!vis[v])dfs1(v);
s.push_back(u);
}
int num[N],cnt=0;
void dfs2(int u)
{
num[u]=cnt;
for(int v:e2[u])if(!num[v])dfs2(v);
}
void kosaraju(int n)
{
for(int i=1;i<=n;i++)if(!vis[i])dfs1(i);
for(int i=n-1;i>=0;i--)if(!num[s[i]])cnt++,dfs2(s[i]);
}
vector<int>E[N];
int a[N],A[N];
int f[N];
int calc(int u)
{
if(f[u])return f[u];
f[u]=max(f[u],A[u]);
for(int v:E[u])f[u]=max(f[u],A[u]+calc(v));
return f[u];
}
int main()
{
int n=in(),m=in();
for(int i=1;i<=n;i++)a[i]=in();
for(int i=1;i<=m;i++)
{
int u=in(),v=in();
e[u].push_back(v),e2[v].push_back(u);
}
kosaraju(n);
for(int i=1;i<=n;i++)
{
A[num[i]]+=a[i];
for(int j:e[i])if(num[i]!=num[j])E[num[i]].push_back(num[j]);
}
int ans=0;
for(int i=1;i<=cnt;i++)ans=max(ans,calc(i));
out(ans);
return 0;
}