BZOJ 1179: [Apio2009]Atm
2016-06-27 22:42
399 查看
Description
Solution
额被坑死了==
首先跑一下scc大家都知道的对吧==
然而我脑洞大开跑完以后直接上dfs还纳闷为什么会T
现在看来是显然的==
所以跑一下spfa搞一下最长路就好了
Code
Solution
额被坑死了==
首先跑一下scc大家都知道的对吧==
然而我脑洞大开跑完以后直接上dfs还纳闷为什么会T
现在看来是显然的==
所以跑一下spfa搞一下最长路就好了
Code
/************************************************************** Problem: 1179 User: bblss123 Language: C++ Result: Accepted Time:5184 ms Memory:53404 kb ****************************************************************/ #include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<vector> #include<stack> #include<map> using namespace std; const int M=5e5+5; int sccid[M],pre[M],lowlink[M],dfs_clock,allc; #define ph push #pragma comment(linker, "/STACK:1024000000,1024000000") struct Edge{int to,nxt;}edge[M<<1],G[M<<1]; int head[M],work[M],tot,tot_edge; inline void Add(int from,int to){ edge[tot]=(Edge){to,head[from]}; head[from]=tot++; } inline void add_edge(int from,int to){ G[tot_edge]=(Edge){to,work[from]}; work[from]=tot_edge++; } stack<int>stk; int val[M],w[M]; inline void Min(int &a,int b){if(a>b)a=b;} inline void predfs(int v){ pre[v]=lowlink[v]=++dfs_clock; stk.ph(v); for(int i=head[v];~i;i=edge[i].nxt){ int to=edge[i].to; if(!pre[to])predfs(to),Min(lowlink[v],lowlink[to]); else if(!sccid[to])Min(lowlink[v],pre[to]); } if(pre[v]==lowlink[v]){ sccid[v]=++allc; for(;!stk.empty();){ int k=stk.top();stk.pop(); sccid[k]=allc; val[allc]+=w[k]; if(k==v)break; } } } inline void rd(int &a){ a=0;char c; while(c=getchar(),!isdigit(c)); do a=a*10+(c^48); while(c=getchar(),isdigit(c)); } int n,m,s,p; map<int,bool>flag[M]; inline void Graph(){ for(int i=1;i<=n;++i){ for(int j=head[i];~j;j=edge[j].nxt){ int to=edge[j].to; if(sccid[to]==sccid[i])continue; if(flag[sccid[i]].find(sccid[to])==flag[sccid[i]].end()) add_edge(sccid[i],sccid[to]),flag[sccid[i]][sccid[to]]=1; } } } inline void Max(int &a,int b){if(a<b)a=b;} int ans=0,dis[M]; #include<queue> queue<int>que; bool ins[M]; inline void spfa(){ memset(dis,0,sizeof(dis)); que.ph(sccid[s]); dis[sccid[s]]=val[sccid[s]]; for(;!que.empty();){ int v=que.front();que.pop(); for(int i=work[v];~i;i=G[i].nxt){ int to=G[i].to; if(dis[v]+val[to]>dis[to]){ dis[to]=dis[v]+val[to]; if(!ins[to])ins[to]=1,que.push(to); } } ins[v]=0; } } int main(){ cin>>n>>m; memset(head,-1,sizeof(head)); memset(work,-1,sizeof(work)); for(int i=1,a,b;i<=m;++i) rd(a),rd(b),Add(a,b); for(int i=1;i<=n;++i)rd(w[i]); cin>>s>>p; for(int i=1;i<=n;++i) if(!pre[i])predfs(i); Graph(); spfa(); for(int a;p--;)rd(a),Max(ans,dis[sccid[a]]); cout<<ans<<endl; return 0; }
相关文章推荐
- CSU1307 并查集+SPFA
- BZOJ3275 Number (最小割)
- BZOJ2809——[Apio2012]dispatching
- BZOJ2809——[Apio2012]dispatching
- 最短路径 -- spfa
- 单源最短路深度分析
- hdoj 1874 畅通工程 vector邻接表测试
- USACO/butter 3.2.6
- 【POJ1860】Currency Exchange
- hdu 1596 find the safest road(spfa算法)
- [bzoj1003] [ZJOI2006]物流运输trans
- [bzoj1500][NOI2005]维修数列
- [bzoj1208] [HNOI2004]宠物收养所
- [bzoj1269][AHOI2006]文本编辑器editort
- [bzoj1503][NOI2004]郁闷的出纳员
- bzoj4305 数学
- bzoj3926 广义后缀自动机
- bzoj2780 广义后缀自动机+parent树+Dfs序+树状数组
- BZOJ1997 2-sat
- bzoj4027 贪心