关于 kosaraju【玄 1 关】
查看原帖
关于 kosaraju【玄 1 关】
865625
KobeBeanBryantCox楼主2024/11/29 23:29

经测试,正常的 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;
}
2024/11/29 23:29
加载中...