题目描述

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. v-charts

    因为工作需要,使用v-chart也有一段时间了,期间针对配置图表也遇到了不少问题,在这里总结一下. 如何配置图表信息 echart的配置项可谓是相当的海量,能不看就不看.而v-chart对其进行了不少 ...

  2. JavaScript之事件的绑定与移除

    对于事件的绑定的方法有多种多样,但是在解除绑定事件的时候,就要注意使用的是那种绑定事件的方法,因为不同的绑定方法所对应的解除事件是不同的. 1. 原始写法 1.1 绑定事件:对象.事件=事件处理函数 ...

  3. leetcode 66.加一 python3

    class Solution: def plusOne(self, digits): """ :type digits: List[int] :rtype: List[i ...

  4. spark报错解决

    19/03/04 18:18:42 ERROR Shell: Failed to locate the winutils binary in the hadoop binary path java.i ...

  5. eclipse中出现An internal error occurred during: "Initializing Java Tooling"

    关于这个问题我查了一下,就是删除.projct文件夹下的文件. 自己试了一下,这个可以及解决问题可是会出现新的问题. 1.SVN关联没了,这样做你的svn信息都没了,项目还要重新导一遍 2.出现了新的 ...

  6. Spring history、design philosophy (Spring的历史及设计理念)

    一,Spring的发展史 1,Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和x ...

  7. msql事务与引擎

    事务介绍   简单来说,事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全成功要么全失败.    MySQL5.5支持事务的引擎:Innodb/ndb  一.事务四大特性 ...

  8. jQuary学习の四の遍历

    向上遍历DOM树: parent():返回被选元素的直接父元素 parents():返回被选元素的所有祖先元素(当后边参数存在时则表示其中与参数相同的祖先元素) parentsUntil()返回介于两 ...

  9. P4081 [USACO17DEC]Standing Out from the Herd

    思路 对所有串建立广义SAM,之后记录SZ,统计本质不同子串时只统计SZ=1的即可 代码 #include <cstdio> #include <algorithm> #inc ...

  10. MySQL explain执行计划优化

    https://www.linuxidc.com/Linux/2016-04/129965.htm