bzoj1179 [Apio2009]Atm
2017-09-21 22:40
246 查看
题目
这题,咋一看,没什么思路。
我们这样想,一个
4000
强连通分量中的点显然可以互相到达,所以就不需要考虑了,先缩点。然后重构图,跑一遍SPFA就好了,注意显然不会有环。
这题,咋一看,没什么思路。
我们这样想,一个
4000
强连通分量中的点显然可以互相到达,所以就不需要考虑了,先缩点。然后重构图,跑一遍SPFA就好了,注意显然不会有环。
#include<bits/stdc++.h> #define N 600000 using namespace std; int n,m,A[N+1],x,y,s,p; int first[N+1],nxt[N+1],to[N+1],siz; int first2[N+1],nxt2[N+1],to2[N+1],siz2; int low[N+1],dfn[N+1],id; int fc[N+1],vis[N+1]; int sta[10*N+1],top,num[N+1]; int dis[N+1]; int belong[N+1],cnt,E[N+1],ans; int f[N+1]; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int read() { int x=0,b=1; char c=nc(); for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1; for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0'; return x*b; } inline void write(int x) { if(x==0)putchar('0'); else { char buf[15]; int len=0; if(x<0)putchar('-'),x=-x; while(x)buf[++len]=x%10+'0',x/=10; for(int i=len;i>=1;i--)putchar(buf[i]); } putchar(' '); } inline void add(int x,int y) { nxt[siz]=first[x]; first[x]=siz; to[siz]=y; siz++; } inline void add2(int x,int y) { nxt2[siz2]=first2[x]; first2[x]=siz2; to2[siz2]=y; siz2++; } inline void tarjan(int x) { dfn[x]=low[x]=++id; sta[++top]=x,vis[x]=true; for(int i=first[x];i!=-1;i=nxt[i]) { int u=to[i]; if(!dfn[u]) tarjan(u),low[x]=min(low[x],low[u]); else if(vis[u])low[x]=min(low[x],dfn[u]); } if(low[x]==dfn[x]) { cnt++;int tmp; do { tmp=sta[top--]; vis[tmp]=false; belong[tmp]=cnt; num[cnt]+=A[tmp]; if(fc[tmp])f[cnt]=true; }while(tmp!=x); } } inline void rebuild() { siz2=0,memset(first2,-1,sizeof(first2)); for(int i=1;i<=n;i++) { for(int j=first[i];j!=-1;j=nxt[j]) { int u=to[j]; if(belong[i]==belong[u])continue; add2(belong[i],belong[u]); } } } inline void SPFA(int s) { queue <int> Q; Q.push(s);dis[s]=num[s]; E[s]=true; while(!Q.empty()) { int x=Q.front();Q.pop(); E[x]=false; for(int i=first2[x];i!=-1;i=nxt2[i]) { int u=to2[i]; if(dis[u]<dis[x]+num[u]) { dis[u]=dis[x]+num[u]; if(E[u])continue; Q.push(u),E[u]=true; } } } } int main() { freopen("in.txt","r",stdin); memset(first,-1,sizeof(first)); n=read();m=read(); for(int i=1;i<=m;i++)x=read(),y=read(),add(x,y); for(int i=1;i<=n;i++)A[i]=read(); s=read(),p=read(); for(int i=1;i<=p;i++)x=read(),fc[x]=true; for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i); rebuild(); SPFA(belong[s]); for(int i=1;i<=cnt;i++)if(f[i])ans=max(ans,dis[i]); cout<<ans; return 0; }
相关文章推荐
- BZOJ_1179_[Apio2009]Atm_tarjan+spfa
- bzoj 1179 [Apio2009]Atm tarjan+最长路
- 【BZOJ1179】【APIO2009】Atm(tarjan+spfa)
- bzoj1179 [Apio2009]Atm(tarjan缩点+spfa)
- 【bzoj1179】 Apio2009—Atm
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
- [BZOJ1179] [Apio2009]Atm(强连通)
- [BZOJ1179][Apio2009]Atm(tarjan+spfa)
- 【BZOJ1179】[Apio2009]Atm【SCC】【最长路】
- 【BZOJ 1179】[Apio2009]Atm
- [BZOJ1179] [Apio2009]Atm(tarjan缩点 + spfa)
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
- bzoj1179: [Apio2009]Atm
- BZOJ 1179: [Apio2009]Atm Tarjan强连通分量缩点,SPFA,DP
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
- BZOJ 1179: [Apio2009]Atm【Trajan+最短路】
- bzoj 1179: [Apio2009]Atm【tarjan+spfa】
- BZOJ1179 [Apio2009]Atm
- 【bzoj1179】 Apio2009—Atm
- bzoj1179 [Apio2009]Atm