zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        return 0;
    }
  • 相关阅读:
    select下拉的value和option内值得获取
    express模块下GET和POST获取前台数据
    Node.js---fs模块
    Node.js---MySQL的增删改查
    Node.js--mysql的应用
    Node.js-router(将大服务拆分成一个个小服务)
    22
    窗口切换
    IO
    第一次实训作业
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13210346.html
Copyright © 2011-2022 走看看