zoukankan      html  css  js  c++  java
  • 强联通分量( 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;
    }
  • 相关阅读:
    决策树算法
    数据挖掘建模-Logistic回归
    Python数据结构与算法-栈和递归函数
    使用python自动化生成软件著作权的源代码
    一起玩转图论算法(1)图的基本表示
    全网最最最详细的软件著作权申请步骤
    时间序列模式(ARIMA)---Python实现
    宝塔面板怎样部署SSL证书?
    Linux基础概念入门
    转载:VMware workstation创建虚拟机,安装Ubuntu系统
  • 原文地址:https://www.cnblogs.com/lmjer/p/8227682.html
Copyright © 2011-2022 走看看