bzoj1179[Apio2009]Atm
bzoj1179[Apio2009]Atm
题意:
给个有向图,每个点有个点权,有些点有酒吧。现在求一个人从任意一点出发获得点权的最大和。要求每个点的点权只能获得一次,且路径最后必须在酒吧结束,可以重复经过点和边。n,m≤500000。
题解:
tarjan缩点之后跑spfa,注意不能用dijkstra,因为求正权边的最长路相当于求最短路时有负权边。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <stack> 5 #include <queue> 6 #define inc(i,j,k) for(int i=j;i<=k;i++) 7 #define maxn 500010 8 #define INF 0x3fffffff 9 using namespace std; 10 11 inline int read(){ 12 char ch=getchar(); int f=1,x=0; 13 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 14 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 15 return f*x; 16 } 17 struct e{int t,n;}es[2][maxn]; int g[2][maxn],ess[2]; 18 void pe(int f,int t,bool o){es[o][++ess[o]]=(e){t,g[o][f]}; g[o][f]=ess[o];} 19 int v[2][maxn],scc[maxn],tot,n,m,s,p,ans; 20 bool ins[maxn]; int tim,low[maxn],dfn[maxn]; stack<int>st; 21 void tarjan(int x){ 22 ins[x]=1; low[x]=dfn[x]=++tim; st.push(x); 23 for(int i=g[0][x];i;i=es[0][i].n){ 24 if(!dfn[es[0][i].t])tarjan(es[0][i].t),low[x]=min(low[x],low[es[0][i].t]); 25 else if(ins[es[0][i].t])low[x]=min(low[x],dfn[es[0][i].t]); 26 } 27 if(low[x]==dfn[x]){ 28 tot++; 29 while(!st.empty()){ 30 int y=st.top(); st.pop(); ins[y]=0; scc[y]=tot; 31 v[1][tot]+=v[0][y]; if(x==y)break; 32 } 33 } 34 } 35 int d[maxn]; bool inq[maxn]; deque<int>q; 36 void spfa(int s){ 37 inc(i,1,tot)d[i]=-1; d[s]=v[1][s]; inq[s]=1; q.push_back(s); 38 while(!q.empty()){ 39 int x=q.front(); q.pop_front(); inq[x]=0; 40 for(int i=g[1][x];i;i=es[1][i].n)if(d[es[1][i].t]<d[x]+v[1][es[1][i].t]){ 41 d[es[1][i].t]=d[x]+v[1][es[1][i].t]; 42 if(!inq[es[1][i].t]){ 43 if(!q.empty()&&d[es[1][i].t]<d[q.front()])q.push_front(es[1][i].t);else q.push_back(es[1][i].t); 44 inq[es[1][i].t]=1; 45 } 46 } 47 } 48 } 49 int main(){ 50 n=read(); m=read(); inc(i,1,m){int x=read(),y=read(); pe(x,y,0);} inc(i,1,n)v[0][i]=read(); 51 s=read(); p=read(); inc(i,1,n)if(!dfn[i])tarjan(i); 52 inc(i,1,n){ 53 for(int j=g[0][i];j;j=es[0][j].n) 54 if(scc[i]!=scc[es[0][j].t])pe(scc[i],scc[es[0][j].t],1); 55 } 56 spfa(scc[s]); inc(i,1,p){int x=read(); if(d[scc[x]]!=-1)ans=max(ans,d[scc[x]]);} 57 printf("%d",ans); return 0; 58 }
20161114
转载于:https://www.cnblogs.com/YuanZiming/p/6067187.html
bzoj1179[Apio2009]Atm相关推荐
- 【强连通分量·Tarjan】bzoj1179: [Apio2009]Atm
新博的第一发! 因为这几天切了几道强连通分量,所以从这里begin [题目描述] Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个Siruseri ...
- 【BZOJ1179】[Apio2009]Atm/抢掠计划
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4701 Solved: 2087 [Submit][Sta ...
- BZOJ 1179: [Apio2009]Atm Tar$滑稽 ra$jan
1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 AT ...
- bzoj 1179: [Apio2009]Atm(Trajan+SPFA)
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4039 Solved: 1754 [Submit][Sta ...
- 【bzoj1179】 Apio2009—Atm
www.lydsy.com/JudgeOnline/problem.php?id=1179 (题目链接) 题意 给出一张有向图,每个节点有点权.标记一些点,找出一条路径,可以重复经过一条边,使得总点权 ...
- 【BZOJ1179】atm,tarjan缩点+最长路径
Time:2016.05.21 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 题目中是一个带点权的有向图,如果这是一个没有环的图那么问题就很简单,拓扑或者直接求最长(短)路径什么的 ...
- P1179: [Apio2009]Atm
缩点+spfa最短路,因为最终不可能有环,所以直接spfa. 1 const maxe=1000001; 2 type 3 node=record 4 f,t:longint; 5 end; 6 va ...
- BZOJ1179 Atm //缩点+spfa
1179: [Apio2009]Atm Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的 ...
- OI 刷题记录——每周更新
每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...
最新文章
- Android重绘ListView高度
- centos7挂载nas存储_CentOS7搭建NAS文件共享存储
- 全Flash网站和单个Flash作品制作的区别
- Git Tag及使用
- Tesseract处理背景渐变的图片
- 新技能 get —— Python 断点续传下载文件
- python第二十二课——list函数
- 最全的Discuz! x2去除forum.php尾巴的方法
- List中根据某个实体的属性去重
- 龚本灿c语言程序设计,C语言程序设计习题集(高等学校教材)
- URI和URL的概念和区别
- java 读取txt乱码问题_Java读取txt文档乱码解决方法
- 项目: 生命游戏(C语言)
- 2021年中青杯B题港珠澳大桥桥梁设计与安全策略数学建模全过程文档及程序
- 高格VE8产品技术白皮书
- 2013年节假日放假安排时间表
- ppp lcp协商报文有哪些_课后分享PPP协议第十三周
- js rsa java解密_RSA使用js加密,使用java解密
- 【Java】初识泛型(带你从初学者角度切入,通俗易懂,速进)
- 新锐任务宝推广渠道推荐