P3387 【模板】缩点

P3387 【模板】缩点

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int head[N],headg[N],dfn[N],low[N],belong[N];
int sta[N],top;
int cnt,tot;
int n,m,sum[N];
int a[N];
//int s[N];
int l,l2;
int dp[N];
bool vis[N];


struct edge{
    int from;
    int to;
    int ne;
}e[N<<1],g[N<<1];

void add(int u,int v){
    e[++l].from=u;
    e[l].to=v;
    e[l].ne=head[u];
    head[u]=l;
}

void add1(int u,int v){
    g[++l2].from=u;
    g[l2].to=v;
    g[l2].ne=headg[u];
    headg[u]=l2;
}

void tarjan(int now){
    dfn[now]=low[now]=++cnt;
    vis[now]=1;
    sta[++top]=now;
    for(int i=head[now];i;i=e[i].ne){
        int n=e[i].to;
        if(!dfn[n]){
            tarjan(n);
            low[now]=min(low[now],low[n]);
        } else if(vis[n]){
            low[now]=min(low[now],dfn[n]);
        }
    }
    if(dfn[now]==low[now]){
        ++tot;
        while(sta[top+1]!=now){
            int v=sta[top];
            belong[v]=tot;
            vis[v]=0;
            sum[tot]+=a[sta[top--]];
        }
    }
}

void dfs(int u){
    if(dp[u])return ;
    dp[u]=sum[u];
    for(int i=headg[u];i;i=g[i].ne){
        int v=g[i].to;
        dfs(v);
        dp[u]=max(dp[u],dp[v]+sum[u]);
    }
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i])tarjan(i);
    }
    //l=0;
    for(int i=1;i<=m;i++){
        int u=e[i].from;
        int v=e[i].to;
        if(belong[u]!=belong[v]){
            add1(belong[u],belong[v]);
        }
    }
    int ans=0;
    for(int i=1;i<=tot;i++){
        if(!dp[i]){
            dfs(i);
            ans=max(ans,dp[i]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2020-06-29 21:11  LightyaChoo  阅读(134)  评论(0编辑  收藏  举报