题目描述

Siruseri 城中的道路都是单向的。不同的道路由路口连接。按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机。令人奇怪的是,Siruseri 的酒吧也都设在路口,虽然并不是每个路口都设有酒吧。

Banditji 计划实施 Siruseri 有史以来最惊天动地的 ATM 抢劫。他将从市中心 出发,沿着单向道路行驶,抢劫所有他途径的 ATM 机,最终他将在一个酒吧庆 祝他的胜利。

使用高超的黑客技术,他获知了每个 ATM 机中可以掠取的现金数额。他希 望你帮助他计算从市中心出发最后到达某个酒吧时最多能抢劫的现金总数。他可 以经过同一路口或道路任意多次。但只要他抢劫过某个 ATM 机后,该 ATM 机 里面就不会再有钱了。 例如,假设该城中有 6 个路口,道路的连接情况如下图所示:

市中心在路口 1,由一个入口符号→来标识,那些有酒吧的路口用双圈来表

示。每个 ATM 机中可取的钱数标在了路口的上方。在这个例子中,Banditji 能抢 劫的现金总数为 47,实施的抢劫路线是:1-2-4-1-2-3-5。

输入输出格式

输入格式:

第一行包含两个整数 N、M。N 表示路口的个数,M 表示道路条数。接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表示第 i 条道路的起点和终点的路口编号。接下来 N 行,每行一个整数,按顺序表示每 个路口处的 ATM 机中的钱数。接下来一行包含两个整数 S、P,S 表示市中心的 编号,也就是出发的路口。P 表示酒吧数目。接下来的一行中有 P 个整数,表示 P 个有酒吧的路口的编号。

输出格式:

输出一个整数,表示 Banditji 从市中心开始到某个酒吧结束所能抢劫的最多 的现金总数。

输入输出样例

输入样例#1:

6 7
1 2
2 3
3 5
2 4
4 1
2 6
6 5
10
12
8
16
1
5
1 4
4 3 5 6
输出样例#1:

47


说说我对这道题的看法?

讨厌死了

首先我写了非常长的时间 然后DKY同学坐我旁边20minA了这道题(ri)

被嘲讽一波之后还是决定考完NOIP之后退役

思路:

缩点 然后跑拓补序DP 然后酒吧扫一遍 完事

但是我莫名其妙在为什么不用判重边这件事上郁闷了好久(MD

为什么不用判重边?你跑拓补序DP的时候是根据当前点的总和加上下一个点的点权去尝试更新的

于是你就算重复连了边 你也只会在第一次判断的时候更新 后面的重边不会影响你的结果

入度也该减的就减 反正保证他能推过去就行了

还有个小细节就是只用从起点跑TARJAN就行了 起点去不了的地方对答案不产生影响

然后?NM有个地方rd[col[y]]写成了rd[y]导致20min

CXK NMSL

上代码:

#include<bits/stdc++.h>
#define MAXN 500010
#define MAXM 500010 using namespace std; int n,m,a[MAXN],b[MAXN];
int dfn[MAXN],low[MAXN],head[MAXN],ectr;
int sta[MAXN],tp,col[MAXN],num,cnt,ans;
int f[MAXN],cash[MAXN],scash[MAXN],str,rd[MAXN];
bool ins[MAXN],bar[MAXN];
queue<int> q;
struct Edge{
int to,nxt;
}edge[MAXM];
struct Data{
int from,to;
}data[MAXM]; void addedge(int from,int to){
ectr++;
edge[ectr].to=to;
edge[ectr].nxt=head[from];
head[from]=ectr;
} inline int read() {
int x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=(x<<)+(x<<)+ch-'',ch=getchar();
return x;
} void tarjan(int x){
dfn[x] = low[x] = ++num;
sta[++tp] = x;ins[x]=true;
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
if(!dfn[y]){
tarjan(y);
low[x] = min(low[x],low[y]);
}
else if(ins[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(dfn[x]==low[x]){
int y=;
cnt++;
do{
y=sta[tp--],ins[y]=false;
col[y] = cnt;
scash[col[y]]+=cash[y];
}while (x!=y);
}
} void topo(){
q.push(col[str]);
f[col[str]] = scash[col[str]];
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
f[y] = max(f[y],f[x] + scash[y]);
if(!--rd[y]) q.push(y);
}
}
} int main(){
n=read(),m=read();
for(int i=;i<=m;i++){
data[i].from=read(),data[i].to=read();
addedge(data[i].from,data[i].to);
}
for(int i=;i<=n;i++){
cash[i]=read();
}
str=read();
int DKY=read();
for(int i=;i<=DKY;i++){
int tra1=read();
bar[tra1]=true;
} tarjan(str); for(int i=;i<=n;i++) head[i]=;
ectr=; for(int i=;i<=m;i++){
int x=data[i].from,y=data[i].to;
if(!dfn[x] || !dfn[y]) continue;
if(col[x] == col[y]) continue;
addedge(col[x],col[y]);
rd[col[y]]++; //对 就是这 20min NMSL
} topo(); for(int i=;i<=n;i++){
if(bar[i]){
ans=max(ans,f[col[i]]);
}
}
cout<<ans<<endl;
return ;
}

TAG : SIN_XIII ⑨

洛谷P3627[APOI2009] (讨厌的)抢掠计划的更多相关文章

  1. 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)

    洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...

  2. 洛谷 P3627 【抢掠计划】

    题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...

  3. 【洛谷P3627】[APIO2009]抢掠计划

    抢掠计划 题目链接 比较水的缩点模板题,Tarjan缩点,重新建图,记录联通块的钱数.是否有酒吧 DAG上记忆化搜索即可 #include<iostream> #include<cs ...

  4. 洛谷 P2721 小Q的赚钱计划

    洛谷 这大概是我见过最水的紫题吧- 洛谷标签赞一个! 题意:你有一年时间,把10w元存银行变成更多钱,在特定时间区间内,你会有一些利息,不过不可中途退出. 直接dp:st[i]表示区间左端点,ed[i ...

  5. 洛谷$P4040\ [AHOI2014/JSOI2014]$宅男计划 贪心

    正解:三分+贪心 解题报告: 传送门$QwQ$ 其实很久以前的寒假就考过了,,,但那时候$gql$没有好好落实,就只写了个二分,并没有二分套三分,就只拿到了$70pts$ #include <b ...

  6. 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路

    题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...

  7. 洛谷 P3627 [APIO2009](抢掠计划 缩点+spfa)

    题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...

  8. 洛谷 P3627 [APIO2009]抢掠计划

    这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...

  9. [洛谷P3627][APIO2009]抢掠计划

    题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...

随机推荐

  1. DotNetCore 部署到IIS 上

    将 DotNetCore MVC 项目成功部署到 IIS 上,记录下配置要点: 1.在 ASP.NET Core 应用中使用 Kestrel Microsoft.AspNetCore.App 元包中包 ...

  2. 在 Azure 上部署 Kubernetes 集群

    在实验.演示的时候,或者是生产过程中,我经常会需要运行一些 Docker 负载.虽然这在本地计算机上十分容易,但是当你要在云端运行的时候就有点困难了.相比于本地运行,在云端运行真的太复杂了.我尝试了几 ...

  3. Java的流

    Java中的流主要是用来读写文件的.只要明确你是读文件还是写文件就可以确定使用哪种流了.读:read   写:writer 1.读文件:filereader这个类,顾名思义就知道是读文件了. 2.写文 ...

  4. Unity 个人用过的地面检测方案总结

    Unity 个人用过的地面检测方案总结 1.普通射线 在角色坐标(一般是脚底),发射一根向下的射线,长度大约为0.2, 只适用于简单地形,实际使用中常常遇到以下问题 用的collider去碰撞地面时, ...

  5. windows下手动安装composer并配置环境变量

    windows下手动安装composer并配置环境变量   转载地址: https://my.oschina.net/7sites/blog/209997 之前发表过一篇如何为composer设置代理 ...

  6. 算法(第四版)C# 习题题解——1.3

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 ...

  7. 复旦高等代数 I(18级)每周一题

    [问题2018A01]  计算下列 $n+1$ 阶行列式的值: $$|A|=\begin{vmatrix} 0 & 1 & 1 & \cdots & 1 \\ 1 &a ...

  8. python进阶(一)

    一.调试Debugging应用 (1)命令行内运行 $ python -m pdb my_script.py 这会触发debugger在脚本第⼀⾏指令处停⽌执⾏.这在脚本很短时会很有帮助.你可以通过( ...

  9. Summary on deep learning framework --- TensorFlow

     Summary on deep learning framework --- TensorFlow Updated on 2018-07-22 21:28:11 1. Check failed: s ...

  10. 2019-4-23 plan

    需要制作springcloud es6的技术文档和demo