• 强联通分量( HihoCoder 1185 )


    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<stack>
    using namespace std;
    
    struct my{
      int v,next;
    };
    
    my bian[200000+10];
    my bian2[200000+10];
    bool visit[20000+10];
    int adj2[20000+10];
    int w[20000+10];
    int adj[20000+10];
    int sccno[20000+10];
    int pre[20000+10];
    int lowlink[20000+10];
    int ans[20000+10];
    stack<int>s;
    int dfsnum;
    int n,m;
    int fa;
    int fa2;
    
    void myinsert(int u,int v){
         bian[++fa].v=v;
         bian[fa].next=adj[u];
         adj[u]=fa;
    }
    
    void myinsert2(int u,int v){
         bian2[++fa2].v=v;
         bian2[fa2].next=adj2[u];
         adj2[u]=fa2;
    }
    
    void tarjan(int u){
         pre[u]=lowlink[u]=++dfsnum;
         s.push(u);
         for (int i=adj[u];i!=-1;i=bian[i].next){
            int v=bian[i].v;
            if(!pre[v]){
                   tarjan(v);
                   lowlink[u]=min(lowlink[v],lowlink[u]);
            }
            else if(!sccno[v]){
                lowlink[u]=min(lowlink[u],pre[v]);
              }
            }
            if(pre[u]==lowlink[u]){
                for(;;){
                    int e=s.top();
                    s.pop();
                    sccno[e]=u;
                    if(e==u) break;
                }
         }
    }
    
    void suodian(){
         for (int i=1;i<=n;i++){
            for (int j=adj[i];j!=-1;j=bian[j].next){
                int u=bian[j].v;
                if(sccno[i]==u) continue;
                if(w[u]==0)
                    continue;
                if(sccno[u]!=u){
                    w[sccno[u]]+=w[u];
                    w[u]=0;
                }
                else myinsert2(sccno[i],u);
            }
         }
    }
    
    void dfs(int x,int last)
     {
        int v;
        ans[x]=max(ans[x],ans[last]+w[x]);
         for(int i=adj2[x];i!=-1;i=bian2[i].next){
             v=bian2[i].v;
             if(w[v]!=0&&visit[v]==false){
                visit[v]=true;
                dfs(v,x);
                visit[v]=false;
             }
         }
    }
    int main(){
        memset(adj,-1,sizeof(adj));
        memset(bian,-1,sizeof(bian));
         memset(adj2,-1,sizeof(adj2));
        memset(bian2,-1,sizeof(bian2));
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++){
            scanf("%d",&w[i]);
        }
        int u,v;
       //for (int i=1;i<=n;i++)  sccno[i]=i;
        for (int i=1;i<=m;i++){
            scanf("%d%d",&u,&v);
            myinsert(u,v);
        }
        /*for (int i=1;i<=n;i++){
                printf("%d ",i);
            for (int j=adj[i];j!=-1;j=bian[j].next){
                printf("%d ",bian[j].v);
            }
            printf("
    ");
        }*/
        tarjan(1);
        for(int i=1;i<=n;++i)
            if(pre[i]==0)
                w[i]=0;
        visit[1]=true;
        suodian();
        dfs(1,1);
       int maxn=-100;
       for (int i=1;i<=n;i++)
        maxn=max(maxn,ans[i]);
        printf("%d
    ",maxn);
    return 0;
    }
  • 相关阅读:
    mariadb
    Linux下安装配置virtualenv与virtualenvwrapper
    配置安装源
    Redis哨兵
    Android 常用工具类之DeviceInfoUtil
    Android 常用工具类之RuntimeUtil
    android 中的几种目录
    listview 滑动以后设置最上面一行为整行展示
    Android 常用工具类之SPUtil,可以修改默认sp文件的路径
    android 在应用中切换语言
  • 原文地址:https://www.cnblogs.com/lmjer/p/8227682.html
Copyright © 2020-2023  润新知