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相关推荐

  1. 【强连通分量·Tarjan】bzoj1179: [Apio2009]Atm

    新博的第一发! 因为这几天切了几道强连通分量,所以从这里begin [题目描述] Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个Siruseri ...

  2. 【BZOJ1179】[Apio2009]Atm/抢掠计划

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4701  Solved: 2087 [Submit][Sta ...

  3. BZOJ 1179: [Apio2009]Atm Tar$滑稽 ra$jan

    1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 AT ...

  4. bzoj 1179: [Apio2009]Atm(Trajan+SPFA)

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4039  Solved: 1754 [Submit][Sta ...

  5. 【bzoj1179】 Apio2009—Atm

    www.lydsy.com/JudgeOnline/problem.php?id=1179 (题目链接) 题意 给出一张有向图,每个节点有点权.标记一些点,找出一条路径,可以重复经过一条边,使得总点权 ...

  6. 【BZOJ1179】atm,tarjan缩点+最长路径

    Time:2016.05.21 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 题目中是一个带点权的有向图,如果这是一个没有环的图那么问题就很简单,拓扑或者直接求最长(短)路径什么的 ...

  7. P1179: [Apio2009]Atm

    缩点+spfa最短路,因为最终不可能有环,所以直接spfa. 1 const maxe=1000001; 2 type 3 node=record 4 f,t:longint; 5 end; 6 va ...

  8. BZOJ1179 Atm //缩点+spfa

    1179: [Apio2009]Atm Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的 ...

  9. OI 刷题记录——每周更新

    每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...

最新文章

  1. Android重绘ListView高度
  2. centos7挂载nas存储_CentOS7搭建NAS文件共享存储
  3. 全Flash网站和单个Flash作品制作的区别
  4. Git Tag及使用
  5. Tesseract处理背景渐变的图片
  6. 新技能 get —— Python 断点续传下载文件
  7. python第二十二课——list函数
  8. 最全的Discuz! x2去除forum.php尾巴的方法
  9. List中根据某个实体的属性去重
  10. 龚本灿c语言程序设计,C语言程序设计习题集(高等学校教材)
  11. URI和URL的概念和区别
  12. java 读取txt乱码问题_Java读取txt文档乱码解决方法
  13. 项目: 生命游戏(C语言)
  14. 2021年中青杯B题港珠澳大桥桥梁设计与安全策略数学建模全过程文档及程序
  15. 高格VE8产品技术白皮书
  16. 2013年节假日放假安排时间表
  17. ppp lcp协商报文有哪些_课后分享PPP协议第十三周
  18. js rsa java解密_RSA使用js加密,使用java解密
  19. 【Java】初识泛型(带你从初学者角度切入,通俗易懂,速进)
  20. 新锐任务宝推广渠道推荐

热门文章

  1. indy9 indy10 MD5 实现方法
  2. SQL数据库收缩日志
  3. 怎样将Datatable中的数据直接导入到Excel模板上
  4. 2005毕业生薪酬预测女超男
  5. 详细分析谷歌紧急修复的 Chrome 0day(CVE-2021-21224)
  6. 有人滥用 GitHub Actions在 GitHub 服务器挖掘密币,且正在蔓延
  7. #55 #56 #58 #59 #60 #66
  8. win7 ubuntu 双系统安装
  9. WiMAX版图不止3G
  10. Python3.2官方文档翻译--异常抛出和自定义异常