40pts求调,悬关
查看原帖
40pts求调,悬关
784813
SakurajiamaMai楼主2023/8/8 15:55
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,M=1e4+10;
int n,m,a[N],res,dist[N],id[N],p[N];
int e[N],ne[N],h[N],w[N],idx;
int dfn[N],low[N],_size[N],_stack[N];
int times,top,scc_num;
bool vis[N];
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int u)
{
    low[u]=dfn[u]=++times;
    _stack[++top]=u,vis[u]=true;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(!dfn[j]) tarjan(j),low[u]=min(low[u],low[j]);
        else if(vis[j]) low[u]=min(low[u],dfn[j]);
    }
    if(low[u]==dfn[u]){
        int y;
        ++scc_num;
        do{
            y=_stack[top--];
            vis[y]=false,id[y]=scc_num;
            if(u==y) break;
            a[u]+=a[y];
        }while(y!=u);
    }
}
void topsort()
{
    queue<int>que;
    for(int i=1;i<=n;i++){
        if(id[i]==i&&!p[i]) que.push(i),dist[i]=a[i];
    }
    while(!que.empty()){
        int now=que.front(); que.pop();
        for(int i=h[now];~i;i=ne[i]){
            int j=e[i];
            p[j]--,dist[j]=max(dist[j],dist[now]+a[j]);
            if(p[j]==0) que.push(j);
        }
    }
}
signed main()
{
    cin>>n>>m;
    memset(h, -1, sizeof h);
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        add(x,y);
    }
    for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
    for(int i=1;i<=N;i++) h[i]=-1,ne[i]=e[i]=w[i]=0;
    for(int i=1;i<=n;i++)
        for(int j=h[i];~j;j=ne[j]){
            int k=e[j];
            int x=id[j],y=id[k];
            if(x!=y) add(x,y),p[y]++;
        }
    topsort();
    for(int i=1;i<=n;i++) res=max(res,dist[i]);
    cout<<res<<endl;
    return 0;
}
2023/8/8 15:55
加载中...