洛谷 P3627 [APIO2009]抢掠计划 题解
Analysis
建图+强连通分量+SPFA求最长路
但要保证最后到达的点中包含酒馆
虽然思路并不难想,但要求的代码能力很高。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #define maxn 500010 7 using namespace std; 8 inline int read() 9 { 10 int x=0; 11 bool f=1; 12 char c=getchar(); 13 for(; !isdigit(c); c=getchar()) if(c=='-') f=0; 14 for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0'; 15 if(f) return x; 16 return 0-x; 17 } 18 inline void write(int x) 19 { 20 if(x<0){putchar('-');x=-x;} 21 if(x>9)write(x/10); 22 putchar(x%10+'0'); 23 } 24 struct node 25 { 26 int from,to,val,nex; 27 }edge[2*maxn]; 28 int n,m,s,p,cnt,ans,top,inl,num; 29 int x[maxn],y[maxn],head[maxn],dfn[maxn],low[maxn],st[maxn],inn[maxn],sum[maxn],si[maxn],money[maxn],dis[maxn]; 30 bool book[maxn],book1[maxn],bar[maxn]; 31 inline void clear() 32 { 33 cnt=0; 34 memset(edge,0,sizeof(edge)); 35 memset(head,0,sizeof(head)); 36 } 37 inline void add(int x,int y) 38 { 39 cnt++; 40 edge[cnt].to=y; 41 edge[cnt].nex=head[x]; 42 head[x]=cnt; 43 } 44 inline void build(int x,int y,int z) 45 { 46 cnt++; 47 edge[cnt].from=x; 48 edge[cnt].to=y; 49 edge[cnt].val=z; 50 edge[cnt].nex=head[x]; 51 head[x]=cnt; 52 } 53 inline void Tarjan(int u) 54 { 55 dfn[u]=low[u]=++num; 56 st[++top]=u; 57 for(int i=head[u];i;i=edge[i].nex) 58 { 59 int v=edge[i].to; 60 if(!dfn[v]) 61 { 62 Tarjan(v); 63 low[u]=min(low[u],low[v]); 64 } 65 else if(!inn[v]) 66 low[u]=min(low[u],dfn[v]); 67 } 68 if(low[u]==dfn[u]) 69 { 70 inn[u]=++inl; 71 while(st[top]!=u) 72 { 73 if(bar[st[top]])book1[inl]=1; 74 sum[inl]+=money[st[top]]; 75 inn[st[top]]=inl; 76 --top; 77 } 78 if(bar[st[top]])book1[inl]=1; 79 sum[inl]+=money[st[top]]; 80 --top; 81 } 82 } 83 inline void spfa() 84 { 85 memset(book,0,sizeof(book)); 86 for(int i=1;i<=n;i++) dis[i]=0; 87 queue<int> q; 88 q.push(inn[s]); 89 book[inn[s]]=1; 90 dis[inn[s]]=sum[inn[s]]; 91 while(!q.empty()) 92 { 93 for(int i=head[q.front()];i;i=edge[i].nex) 94 { 95 if(dis[edge[i].to]<dis[edge[i].from]+edge[i].val) 96 { 97 dis[edge[i].to]=dis[edge[i].from]+edge[i].val; 98 if(book[edge[i].to]==0) 99 { 100 q.push(edge[i].to); 101 book[edge[i].to]=1; 102 } 103 } 104 } 105 book[q.front()]=0; 106 q.pop(); 107 } 108 } 109 int main() 110 { 111 n=read();m=read(); 112 for(int i=1;i<=m;i++) 113 { 114 x[i]=read();y[i]=read(); 115 add(x[i],y[i]); 116 } 117 for(int i=1;i<=n;i++)money[i]=read(); 118 s=read();p=read(); 119 120 for(int i=1;i<=p;i++) 121 { 122 int x; 123 x=read(); 124 bar[x]=1; 125 } 126 for(int i=1;i<=n;i++) 127 if(!dfn[i]) 128 Tarjan(i); 129 130 clear(); 131 for(int i=1;i<=m;i++) 132 if(inn[x[i]]!=inn[y[i]]) 133 build(inn[x[i]],inn[y[i]],sum[inn[y[i]]]); 134 spfa(); 135 for(int i=1;i<=inl;i++) 136 if(book1[i]==1) 137 ans=max(ans,dis[i]); 138 write(ans); 139 return 0; 140 }
请各位大佬斧正(反正我不认识斧正是什么意思)
转载于:https://www.cnblogs.com/handsome-zyc/p/11250401.html
洛谷 P3627 [APIO2009]抢掠计划 题解相关推荐
- 洛谷 P3627 [APIO2009]抢掠计划
这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...
- 【luogu P3627 [APIO2009]抢掠计划】 题解
题目链接:https://www.luogu.org/problemnew/show/P3627 把点权转化到边权上去. #include <stack> #include <que ...
- 洛谷P1129 [ZJOI2007] 矩阵游戏 题解
洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...
- 洛谷P3336 [ZJOI2013]话旧 题解
洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...
- 洛谷P4683 [IOI2008] Type Printer 题解
洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...
- 洛谷P3647 [APIO2014] 连珠线 题解
洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...
- 洛谷P4170 [CQOI2007]涂色 题解
洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...
- 洛谷P1868 饥饿的奶牛 题解
洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...
- 洛谷P1462 通往奥格瑞玛的道路 题解
洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...
最新文章
- 开始使用vue.js
- 什么是Session?
- angular 构建可以动态挂载的配置服务
- 计算机文化基础分析总结,《计算机文化基础实训》教学方案设计与课题分析总结.doc...
- (8)Verilog include 头文件使用路径(FPGA不积跬步101)
- 开源项目:SandDance-数据可视化
- netstat mysql_mysql-netstat
- Nginx+Tomcat搭建高性能负载均衡集群的实现方法
- 诗词文中的地名(名人生卒地、生卒年、名人籍贯)
- 【转】java中的Map集合
- c++ 实现四阶龙格库塔方法
- spring boot 邮箱验证总结
- flashfxp 命令行
- pacman系列命令
- 软件工程实践寒假作业
- Hbase Locality
- 7个小学语文学习锦囊,让孩子取得好的成绩(转给家长)
- for in 循环(遍历循环)
- 牛客小白月赛28 D.位运算之谜
- Fiddler抓包工具是最强大最好用的 Web 调试工具之一
热门文章
- java okhttp https_OkHttp是否支持接受自签名SSL证书?
- 央视网报道“手机就能打到拖拉机”,网友直呼“想种地了”
- 从微服务到 Serverless | 开源只是开始,终态远没有到来
- sqlserver日期dateadd及STUFF等应用
- SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)
- 同步一张表、复制过滤设置
- 查询DBA_HIST_ACTIVE_SESS_HISTORY缓慢
- ORA-01720: grant option does not exist for 'xxx.xxxx'
- 017_python常用小技巧
- python学习之自习语法(20180626_update)