強聯通分量( HihoCoder 1185 )

來源:互聯網
上載者:User

標籤:ace   keyword   cno   link   tac   ring   ==   mes   include   

#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("\n");    }*/    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\n",maxn);return 0;}

強聯通分量( HihoCoder 1185 )

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.