bzoj 1179(tarjan缩点+最长路)
来源:互联网 发布:铁三角msr7煲机 知乎 编辑:程序博客网 时间:2024/06/07 22:18
传送门
用tarjan缩点后在DAG上跑一个SPFA最长路即可,数组有点多,该赋初值一定要赋初值。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<stack>#include<queue>#include<vector>using namespace std;const int maxn=500002;int head[maxn],edge=0,n,m,source,P;int val[maxn];int pub[maxn],dfn[maxn],low[maxn],ins[maxn],belong[maxn];int alc[maxn],sum[maxn],dis[maxn],scc=0,cnt=0;struct EDGE { int u,v,nxt;}e[maxn];stack<int> S;vector<int> G[maxn];inline int read() { int x=0;char c=getchar(); while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x;}inline void adde(int u,int v) { e[edge].nxt=head[u],e[edge].u=u,e[edge].v=v,head[u]=edge++;}void dfs(int p) { dfn[p]=low[p]=++cnt; ins[p]=1; S.push(p); for (int i=head[p];~i;i=e[i].nxt) { int v=e[i].v; if (!dfn[v]) { dfs(v); low[p]=min(low[p],low[v]); } else if (ins[v]) low[p]=min(low[p],dfn[v]); } if (low[p]==dfn[p]) { sum[++scc]=alc[scc]=0; while (!S.empty()) { int t=S.top(); S.pop(); ins[t]=0,belong[t]=scc,sum[scc]+=val[t]; if (t==source) source=scc; if (pub[t]) alc[scc]=1; if (t==p) break; } }}void tarjan() { for (register int i=1;i<=n;++i) if (!dfn[i]) dfs(i); for (register int i=0;i<edge;++i) { int u=belong[e[i].u],v=belong[e[i].v]; if (u!=v) G[u].push_back(v); }}inline void spfa(int source) { queue<int> q; bool inq[maxn]; memset(inq,false,sizeof(inq)); memset(dis,-1,sizeof(dis)); inq[source]=1,dis[source]=sum[source]; q.push(source); while (!q.empty()) { int p=q.front(),siz=G[p].size(); q.pop(),inq[p]=false; for (int j=0;j<siz;++j) { int v=G[p][j]; if (dis[v]<dis[p]+sum[v]) { dis[v]=dis[p]+sum[v]; if (!inq[v]) { inq[v]=true; q.push(v); } } } } int ans=0; for (int i=1;i<=scc;++i) if (alc[i]) ans=max(ans,dis[i]); printf("%d\n",ans);}int main() {// freopen("bzoj 1179.in","r",stdin); memset(head,-1,sizeof(head)); n=read(),m=read(); while (m--) { int u,v; u=read(),v=read(); adde(u,v); } for (register int i=1;i<=n;++i) val[i]=read(),G[i].clear(),dfn[i]=pub[i]=0; source=read(),P=read(); while (P--) pub[read()]=1; tarjan(); spfa(source);// for (int i=1;i<=scc;++i) printf("%d:%d\n",i,sum[i]);// for (register int i=1;i<=n;++i) printf("%d:%d\n",i,belong[i]); return 0;}
阅读全文
0 0
- bzoj 1179(tarjan缩点+最长路)
- bzoj 1179 [Apio2009]Atm tarjan+最长路
- NKOJ 3213 牧草鉴赏家(Tarjan缩点+最长路)
- 【模板】Tarjan 缩点 + 最长路
- poj 3592 Instantaneous Transference tarjan缩点 最长路 ++tarjan模版 && spfa最长路模版
- BZOJ 1093 浅谈tarjan缩点DAG最长路径即拓扑排序
- poj 3592 Instantaneous Transference(tarjan + 缩点 + 最长路)
- [SDOI2010]所驼门王的宝藏 --tarjan缩点+最长路
- BZOJ 1179: [Apio2009]Atm(tarjan缩点+spfa)
- bzoj 1179 ATM tarjan缩点+spfa最短路
- bzoj 1051: [HAOI2006]受欢迎的牛(tarjan 缩点)
- 【bzoj 1051】[HAOI2006]受欢迎的牛(Tarjan缩点)
- 【BZOJ1179】atm,tarjan缩点+最长路径
- BZOJ 1179 ATM (强连通分量缩点+spfa最长路)
- POJ 3160 Father Christmas flymouse tarjan缩点+spfa求最长路
- 1924: [Sdoi2010]所驼门王的宝藏 tarjan缩点+dp最长路
- hrbust 1797 Fly【Tarjan强连通+缩点染色+最长路SPFA】好题~
- [洛谷 2403]所驼门王的宝藏---tarjan缩点+最长路(dp)
- 《机器学习实战》学习笔记-[12]-回归-树回归
- epoll介绍和使用
- POJ
- 【shell】tr命令及常见用法
- poj 3320 尺取法
- bzoj 1179(tarjan缩点+最长路)
- 用C语言实现从C到C++的注释转换
- 由前序遍历和中序遍历重建二叉树
- iOS自动化打包发布(fastlane)
- zoj 2724 优先队列
- windows7 下安装64位oracle11g用PL/SQL Developer连接报错问题
- ANDROID NOTIFICATION 通知的使用
- editplus 快捷键
- Redis之Sentinel主从复制,读写分离,主从切换