莫名80分
查看原帖
莫名80分
556955
123wbl楼主2024/7/11 10:05
#include<iostream>
#include<cstring>
using namespace std;
struct node
{
    int to,next;
}e[200001];
int n,m,a[20001],head[20001],tot,vis[20001],top,tp,pd[20001];
int dfn[20001],low[20001],x[200001],y[200001],s[20001],k;
int sum[20001],f[20001],ans;
inline void add(int u,int v)
{
    e[++tot].to=v;
    e[tot].next=head[u];
    head[u]=tot;
}
inline void tarjan(int u)
{
    dfn[u]=low[u]=++tp;
    s[++top]=u;
    pd[u]=1;
    for(int i=head[u];i;i=e[i].next)
    {
        int v=e[i].to;
        if(!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else
            if(pd[v])
                low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u])
    {
        k++;
        while(s[top+1]!=u)
        {
            vis[s[top]]=k;
            pd[s[top]]=0;
            sum[k]+=a[s[top]];
            top--;
        }
    }
}
inline void search(int x)
{
    if(f[x]) return;
    f[x]=sum[x];
    int maxx=0;
    for(int i=head[x];i;i=e[i].next)
    {
        int v=e[i].to;
        if(!f[v]) search(v);
        maxx=max(maxx,f[v]);
    }
    f[x]+=maxx;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
    {
        cin>>x[i]>>y[i];
        add(x[i],y[i]);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i]) tarjan(i);
    memset(e,0,sizeof(e));
    tot=0;
    for(int i=1;i<=m;i++)
        if(vis[x[i]]!=vis[y[i]])
            add(vis[x[i]],vis[y[i]]);
    for(int i=1;i<=k;i++)
        if(!f[i])
        {
            search(i);
            ans=max(ans,f[i]);
        }
    cout<<ans;
}

玄学80分,#1TLE,#7WA,求佬帮忙看一下

2024/7/11 10:05
加载中...