蒟蒻求助40分,调的心态裂了
查看原帖
蒟蒻求助40分,调的心态裂了
418900
像晚风楼主2021/7/31 17:42
#include<bits/stdc++.h>
using namespace std;
const int inf=1e6+5;
int low[inf],dfn[inf],d[inf],f[inf],head[inf],vis[inf],dis[inf],in[inf],head1[inf];
int cnt,ans,sum,n,cnt1,m,x,y,ss;
struct node{
    int next,to;
}e[inf*2],e1[inf*2];
stack<int>s;
void add(int x,int y)
{
    e[++cnt]={head[x],y};
    head[x]=cnt;
}

void add1(int x,int y)
{
    e1[++cnt1]={head1[x],y};
    head1[x]=cnt1;
}

void tarjan(int x)
{
    dfn[x]=low[x]=++sum;
    vis[x]=1;
    s.push(x);
    for(int i=head[x];i;i=e[i].next)
    {
        int to=e[i].to;
        if(!dfn[to])
            tarjan(to),low[x]=min(low[x],low[to]);
        else if(vis[to])
            low[x]=min(low[x],dfn[to]);
    }
    if(dfn[x]==low[x])
    {
        ans++;
        int y;
        while(1)
        {
            y=s.top();
            s.pop();
            d[y]=ans;
            f[ans]++;
            vis[y]=0;
            if(x==y)break;
            dis[x]+=dis[y];
        }
    }
}
queue<int>q;
void topo()
{
    for(int i=1;i<=n;i++)
        if(d[i]==i&&!in[i])
            q.push(i),f[i]=dis[i];

        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=head1[u];i;i=e1[i].next)
            {
                int to=e1[i].to;
                f[to]=max(f[to],f[u]+dis[to]);
                in[to]--;
                if(!in[to])
                    q.push(to);
            }
        }
}
void clear()
{
    memset(vis,0,inf);
    memset(head,0,sizeof(head));
    cnt=0;
    memset(e,0,sizeof(e));
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>dis[i];
    for(int i=1;i<=m;i++)
        cin>>x>>y,add(x,y);

    for(int i=1;i<=n;i++)
        if(!dfn[i]) tarjan(i);

        clear();
        for(int i=1;i<=n;i++)
            for(int j=head[i];j;j=e[j].next)
            {
                int to=e[j].to;
                if(d[i]!=d[to])
                   in[d[to]]++, add1(d[i],d[to]);
            }
        topo();
        for(int i=1;i<=n;i++)
            ss=max(ss,f[i]);
        cout<<ss<<endl;
            return 0;
}
2021/7/31 17:42
加载中...