標籤: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 )