题目描述

国家一级爬山运动员h10今天获得了一张有着密密麻麻标记的地图,在好奇心的驱使下,他又踏上了去爬山的路。

对于爬山,h10有一个原则,那就是不走回头路,于是他把地图上的所有边都标记成了有向边。他决定从点S出发,每到达一个新的节点他就可以获得一定的成就值。同时h10又是一个很珍惜时间的运动员,他不希望这次爬山的成就值白白浪费,所以最后他一定要在一个存档点停下,保存自己的成就值。

请你计算出在此次爬山运动中h10能够得到的最大成就值。保证h10能走到存档点。

输入

第一行两个整数 N,M,表示点数和边数。

接下来 M 行,每行两个整数 u,v,表示u到v有一条有向边(没有自环)。

第 M+2 行 N 个正整数,表示每个点的成就值。

接下来一行两个整数 S,p,表示出发点和存档点个数。

下面一行 p 个整数,表示存档点。

输出

一个正整数,表示最大成就值。

样例输入

5 7

5 1

3 1

2 5

3 5

4 3

4 2

4 5

7 6 3 2 2

4 3

1 5 2

样例输出

17

数据范围

对于 30% 的数据, N,M≤1000,并且地图为有向无环图。

对于 100% 的数据, N,M≤500000。(数据有梯度,注意答案的大小)

解法

这道题模型很明显,考虑图是一个DAG(有向无环图)的时候,拓扑排序上动态规划即可。

对于有环的情况,发现一个环的贡献是这个环上所有点的权值之和。

所以使用强连通分量把每个环都缩成一个点。

再使用拓扑排序上动态规划即可。

※手写栈需要

代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<string.h>
  5. #include<algorithm>
  6. #define ll long long
  7. #define ln(x,y) ll(log(x)/log(y))
  8. #define sqr(x) ((x)*(x))
  9. using namespace std;
  10. const char* fin="aP2.in";
  11. const char* fout="aP2.out";
  12. const ll inf=0x7fffffff;
  13. const ll maxn=500007,maxm=maxn*2;
  14. ll n,m,i,j,k,st,En,tot,num;
  15. ll a[maxn],fi[maxn],ne[maxm],la[maxm];
  16. ll stack[maxn],dfn[maxn],low[maxn],fa[maxn];
  17. ll ru[maxn];
  18. ll b[maxn];
  19. ll f[maxn],ans;
  20. ll cz[maxn];
  21. bool bz[maxn],en[maxn];
  22. ll read(){
  23. ll x=0;
  24. char ch=getchar();
  25. while (ch<'0' || ch>'9') ch=getchar();
  26. while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
  27. return x;
  28. }
  29. void add_line(ll a,ll b){
  30. tot++;
  31. ne[tot]=fi[a];
  32. la[tot]=b;
  33. fi[a]=tot;
  34. }
  35. struct handstack{
  36. ll i,j,k,v;
  37. }hs[maxn];
  38. int hst=0;
  39. void handdfs(ll v){
  40. hs[++hst].v=v;
  41. hs[hst].i=0;
  42. while (hst){
  43. if (hs[hst].i){
  44. if (hs[hst].k){
  45. if (!dfn[la[hs[hst].k]]) {
  46. hs[hst+1].v=la[hs[hst].k];
  47. hs[hst+1].i=0;
  48. hst++;
  49. continue;
  50. }else if (bz[la[hs[hst].k]]) low[hs[hst].v]=min(low[la[hs[hst].k]],low[hs[hst].v]);
  51. hs[hst].k=ne[hs[hst].k];
  52. }else{
  53. if (low[hs[hst].v]==dfn[hs[hst].v]){
  54. while (stack[0]>hs[hst].j) {
  55. for (hs[hst].k=fi[stack[stack[0]]];hs[hst].k;hs[hst].k=ne[hs[hst].k]) add_line(hs[hst].v,la[hs[hst].k]);
  56. fa[stack[stack[0]]]=hs[hst].v;
  57. a[fa[stack[stack[0]]]]+=a[stack[stack[0]]];
  58. bz[stack[stack[0]--]]=false;
  59. }
  60. fa[stack[stack[0]]]=hs[hst].v;
  61. bz[stack[stack[0]--]]=false;
  62. }
  63. hst--;
  64. }
  65. }else{
  66. hs[hst].i=1;
  67. dfn[hs[hst].v]=low[hs[hst].v]=++num;
  68. bz[stack[hs[hst].j=++stack[0]]=hs[hst].v]=true;
  69. hs[hst].k=fi[hs[hst].v];
  70. }
  71. }
  72. }
  73. void dfs(ll v){
  74. ll i,j,k;
  75. dfn[v]=low[v]=++num;
  76. bz[stack[j=++stack[0]]=v]=true;
  77. for (k=fi[v];k;k=ne[k])
  78. if (!dfn[la[k]]) {
  79. dfs(la[k]);
  80. low[v]=min(low[la[k]],low[v]);
  81. }else if (bz[la[k]]) low[v]=min(dfn[la[k]],low[v]);
  82. if (low[v]==dfn[v]){
  83. while (stack[0]>j) {
  84. for (k=fi[stack[stack[0]]];k;k=ne[k]) add_line(v,la[k]);
  85. fa[stack[stack[0]]]=v;
  86. a[fa[stack[stack[0]]]]+=a[stack[stack[0]]];
  87. bz[stack[stack[0]--]]=false;
  88. }
  89. fa[stack[stack[0]]]=v;
  90. bz[stack[stack[0]--]]=false;
  91. }
  92. }
  93. void topsort(){
  94. ll i,j,k,head=0,tail=0;
  95. for (i=1;i<=n;i++){
  96. if (fa[i] && i==fa[i]) for (k=fi[i];k;k=ne[k]){
  97. if (/*cz[fa[la[k]]]<i && */fa[la[k]]!=i) ru[fa[la[k]]]++/*,cz[fa[la[k]]]=i*/;
  98. }
  99. }
  100. for (i=1;i<=n;i++) if (!ru[i] && fa[i]==i) {
  101. b[++tail]=i;
  102. f[i]=a[i];
  103. break;
  104. }
  105. while (head++<tail){
  106. if (en[b[head]]) ans=max(ans,f[b[head]]);
  107. for (k=fi[b[head]];k;k=ne[k]) if (fa[la[k]]!=b[head]){
  108. i=fa[la[k]];
  109. f[i]=max(f[i],f[b[head]]+a[i]);
  110. if (--ru[i]==0) b[++tail]=i;
  111. }
  112. }
  113. }
  114. int main(){
  115. n=read();m=read();
  116. for (i=1;i<=m;i++){
  117. j=read();k=read();
  118. add_line(j,k);
  119. }
  120. for (i=1;i<=n;i++) a[i]=read();
  121. st=read();En=read();
  122. handdfs(st);
  123. for (i=1;i<=En;i++) j=read(),en[fa[j]]=true;
  124. topsort();
  125. printf("%lld",ans);
  126. return 0;
  127. }

【JZOJ4771】【NOIP2016提高A组模拟9.9】爬山的更多相关文章

  1. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  2. 【NOIP2016提高A组模拟9.14】数列编辑器

    题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...

  3. 【NOIP2016提高A组模拟9.24】总结

    第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...

  4. 【JZOJ4746】【NOIP2016提高A组模拟9.3】树塔狂想曲

    题目描述 相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和.走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1).如下图是一个数塔,映射到该数塔上行 ...

  5. 【JZOJ4745】【NOIP2016提高A组模拟9.3】看电影

    题目描述 听说NOIP2016大家都考得不错,于是CCF奖励省常中了 K 张变形金刚5的电影票奖励OI队的同学去看电影.可是省常中OI队的同学们共有 N(N >= K)人.于是机智的你想到了一个 ...

  6. 【JZOJ4803】【NOIP2016提高A组模拟9.28】求导

    题目描述 输入 输出 样例输入 2x^2+3x+1 样例输出 4x+3 数据范围 样例解释 求导的意思: 多项式是由若干个单项式构成的 单项式的一般形式是ax^b,其中ab都是常数,x是自变量 对于单 ...

  7. 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子

    题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...

  8. [jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)

    题目链接: http://172.16.0.132/senior/#main/show/4668 题目: 题解: 考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因 ...

  9. [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)

    题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...

随机推荐

  1. 关于HTTP协议(转)

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  2. PAT甲级——A1018 Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  3. 使用poco再次封装redis

    为方便程序对redis操作,我对poco的redis进行了再次封装,主要是针对自己应用需要的部分. 开发工具:netbean 系统环境:centos7 poco版本: poco-1.9.0-all 其 ...

  4. [Day4] Nginx Http模块二

    一. POST_READ阶段     1. 用户ip在http请求中的传递? 前提:Tcp连接四元组(src ip,src port,dst ip,dst port) HTTP头部 X-Formard ...

  5. js 打开app应用,如果没有安装就去下载

    废话不多说,直接上代码 var APPCommon = { iphoneSchema: 'XingboTV://', iphoneDownUrl: 'https://itunes.apple.com/ ...

  6. HDFS 数据存取策略

  7. No module named 'sklearn.impute',更新scikit-learn

    -------我错了,本篇作废,我把自己的包更新坏了,大家不要往下看了------------------最终我是把anaconda卸载重装的--------- 使用scikit-learn模块进行缺 ...

  8. UVA10215The Largest/Smallest Box(小数精度)

    本身很容易却因为评测机有毒的一道题,,,看网上题解说最后一个答案要加一个很小的数才能AC,据说是因为没有speci judge #include <iostream> #include & ...

  9. openldap 2.4 centos7 常用配置

    新版的openldap弃用了sldap.conf配置文件,引入一种动态配置,所以尽量不要直接修改配文件 如果直接修改了配置文件可以用slaptest -u命令检查 1.安装openldap,可能需要e ...

  10. URI、URL 和 URN的区别

        关于URI:URL类似于住址,它告诉你一种寻找目标的方式.    URL和URN都是URI的子集. URI规范:协议名称://域名.根域名/目录/文件名.后缀#sddf URI :Unifor ...