洛谷P3627[APOI2009] (讨厌的)抢掠计划
题目描述
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 从市中心开始到某个酒吧结束所能抢劫的最多 的现金总数。
输入输出样例
- 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
- 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] (讨厌的)抢掠计划的更多相关文章
- 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)
洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...
- 洛谷 P3627 【抢掠计划】
题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...
- 【洛谷P3627】[APIO2009]抢掠计划
抢掠计划 题目链接 比较水的缩点模板题,Tarjan缩点,重新建图,记录联通块的钱数.是否有酒吧 DAG上记忆化搜索即可 #include<iostream> #include<cs ...
- 洛谷 P2721 小Q的赚钱计划
洛谷 这大概是我见过最水的紫题吧- 洛谷标签赞一个! 题意:你有一年时间,把10w元存银行变成更多钱,在特定时间区间内,你会有一些利息,不过不可中途退出. 直接dp:st[i]表示区间左端点,ed[i ...
- 洛谷$P4040\ [AHOI2014/JSOI2014]$宅男计划 贪心
正解:三分+贪心 解题报告: 传送门$QwQ$ 其实很久以前的寒假就考过了,,,但那时候$gql$没有好好落实,就只写了个二分,并没有二分套三分,就只拿到了$70pts$ #include <b ...
- 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路
题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...
- 洛谷 P3627 [APIO2009](抢掠计划 缩点+spfa)
题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...
- 洛谷 P3627 [APIO2009]抢掠计划
这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...
- [洛谷P3627][APIO2009]抢掠计划
题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...
随机推荐
- appium工作原理
Appium原理 面试的时候,被问到appium原理,一点不会,实在尴尬.大家可以直接翻看原作https://blog.csdn.net/jffhy2017/article/details/69220 ...
- Java EE开发技术课程第三周
一.分析Filter例子: @WebFilter(filterName="log",urlPatterns={"/*"})//创建一个LOgFilter类pub ...
- 高校表白APP-冲刺第四天
第四天,我们进行了团队的的四次会议. 一.任务: 昨天任务:完成登录界面注册界面修改密码界面. 今日任务:完成跳转,并解决闪退问题. 明日任务:连接本地数据库,进行APP的第一次登陆. 二.遇到的困难 ...
- ssh很慢的问题转子
根据网上的解决办法解决了,记录一下: 问题:ssh ***@192.*.*.* ,然后就一直卡在这个地方,很久以后才会出现让输入密码的提示 解决办法:1.关闭防火墙--chkconfig ipta ...
- 如何在Linux 中获取硬盘分区或文件系统的UUID?
作为一个 Linux 系统管理员,你应该知道如何去查看分区的 UUID 或文件系统的 UUID.因为现在大多数的 Linux 系统都使用 UUID 挂载分区.你可以在 /etc/fstab 文件中可以 ...
- JS----对象的合并与克隆
一. 合并与克隆的差别 1. 克隆是特殊的合并(以空对象作为目标对象,非空对象作为源对象进行合并),克隆要求目标对象与源对象的 constructor相同. 2. 克隆的源对象只有一个,合并的源对象可 ...
- Emote木马分析
前言:网上找的样本是EXE的,没有邮件样本,所以只做了exe分析. 一.Emote木马相关信息 文件: C:\Users\Desktop\Samp.exe 大小: 249856 bytes 文件版本: ...
- js 计算两个时间戳之间相隔天数
var start=1491789600000;//2017-4-10 10:00 var end=1494381600000;//2017-5-10 10:00 var utc=end-start; ...
- flutter-fluro
路由传参 route.dart import 'package:fluro/fluro.dart'; //添加页面 import 'package:m/pages/loginPage.dart'; i ...
- Yii1操作phpexcel
Yii::import('application.vendors.phpexcel.*'); Yii::import('application.vendors.phpexcel.PHPExcel.*' ...