hszxoj ATM

  • 题目描述:\(Siruseri\) 城中的道路都是单向的。不同的道路由路口连接。按照法律的规定, 在每个路口都设立了一个 \(Siruseri\) 银行的 \(ATM\) 取款机。令人奇怪的是,\(Siruseri\) 的酒吧也都设在路口,虽然并不是每个路口都设有酒吧。\(Bandit ji\) 计划实施 \(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\) 个有酒吧的路口的编号 \(N, M<=500000\) 。每个 \(ATM\) 机中可取的钱数为一个非负整数且不超过 \(4000\) 。 输入数据保证你可以从市中心沿着 \(Siruseri\) 的单向的道路到达其中的至少一个酒吧。

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

  • 可以想到 \(spfa\) 跑最长路 \(\Large{but}\) \(\Large{N,M<=500000}\) 且 \({只要他抢劫过某个 ATM 机后,该 ATM 机 里面就不会再有钱了}\)

  • 这就比较该死,直接 \(spfa\) 一定会超时,且没办法搞这个不能反复取钱,所以就用到 \(\large{tarjan缩点}\)

  • 输入的时候存了一下这个from和to,为的是缩完点后再次建图时的判断,如果该条路上起点和终点在一个连通块里,自然就不需要把他们俩再连起来了

for(int i=1;i<=m;i++)
if(color[from[i]]!=color[to[i]])
e[color[from[i]]].push_back(color[to[i]]);
  • 于是谈到了再次建图,用 &tarjan$ 缩完点后,建一遍缩完点的图,再跑 \(spfa\) 就不会超时了
  • 我这里没有建两个图,缩完点后之前的图就没用了,吧之前的图初始化掉再建一遍新的图就好了
memset(e,0,sizeof(e));
for(int i=1;i<=m;i++)
if(color[from[i]]!=color[to[i]])
e[color[from[i]]].push_back(color[to[i]]);
  • 观察输入可以发现他讲出发点和结束点给了,出发点就是 \(s\) ,结束点就是那几个酒吧 \(bar\) ,讲这几个酒吧中获利最大的那个输出就是了
  • 然后发现这个玩意在跑 \(tarjan\) 缩点的时候根本用不到,所以不妨在跑完 \(tarjan\) 之后再把这些东西输入,就会方便很多,不然要是一开始就输入的话就需要记录这些点,然后在算 \(spfa\) 的时候还需要给他一个判断是不是酒吧的点,就很麻烦
  • 像这样
for(i=1;i<=pos;++i)ls=read(),club[ls]=1;
if(club[z])win[tot]=1;
for(i=1;i<=tot;++i)if(win[i])ansss=max(ansss,dis[i]);
  • 但是如果把他在后面输入,就可以只
for(int i=1;i<=p;i++) read(bar),ans=max(ans,d[color[bar]]);
  • 全部代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=500001;
template<typename Tp> inline void read(Tp&x)
{
x=0;register bool f=1;
register char c=getchar();
for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=0;
for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
x=(f?x:~x+1);
}
vector<int>e[N];
stack<int>sta;
queue<int> q;
int n,m,s,p,bar,ans,sccnt,tot;
int from[N],to[N],w[N],dfn[N],low[N],color[N],siz[N],d[N];
bool v[N],ins[N];
void tarjan(int x)
{
dfn[x]=low[x]=++tot;
sta.push(x),ins[x]=1;
for(int y:e[x])
{
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;++sccnt;
while(y!=x)
y=sta.top(),
sta.pop(),
ins[y]=0,
color[y]=sccnt,
siz[sccnt]+=w[y];
}
}
void spfa(int s)
{
q.push(s);
d[s]=siz[s];
v[s]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
v[x]=0;
for(int y:e[x])
{
if(d[y]<d[x]+siz[y])
{
d[y]=d[x]+siz[y];
if(!v[y]) q.push(y),v[y]=1;
}
}
}
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
read(n),read(m);
for(int i=1;i<=m;i++)
read(from[i]),read(to[i]),
e[from[i]].push_back(to[i]);
for(int i=1;i<=n;i++) read(w[i]);
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
memset(e,0,sizeof(e));
for(int i=1;i<=m;i++)
if(color[from[i]]!=color[to[i]])
e[color[from[i]]].push_back(color[to[i]]);
read(s),read(p);
spfa(color[s]);
for(int i=1;i<=p;i++) read(bar),ans=max(ans,d[color[bar]]);
cout<<ans;
}
  • 但是离谱的是,把小于号改成大于号也对,跑最短路也对了???,

\(\Huge\color{a7e747}{太水了这个数据}\)

memset(d,0x3f,sizeof(d));
q.push(s);
d[s]=siz[s];
v[s]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
v[x]=0;
for(int y:e[x])
{
if(d[y]>d[x]+siz[y])
{
d[y]=d[x]+siz[y];
if(!v[y]) q.push(y),v[y]=1;
}
}
}
  • 不要手残 \(\Huge\color{3fdfaf}{qwq}\)

hszxoj ATM [tarjan]的更多相关文章

  1. bzoj 1179[Apio2009]Atm (tarjan+spfa)

    题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  2. 【BZOJ-1179】Atm Tarjan + SPFA

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2407  Solved: 993[Submit][Status ...

  3. 【BZOJ1179】 [Apio2009]Atm tarjan缩点+SPFA

    Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口 ...

  4. BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )

    对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. ------------------------------------------------------ ...

  5. 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

  6. BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1179 题意概括 有一个有向图,每一个节点有一个权值,其中有一些结束点. 现在,你要从S出发,到达任 ...

  7. 【BZOJ1179】[Apio2009]Atm (tarjan+SPFA)

    显而易见的tarjan+spfa...不解释了 ; type edgetype=record toward,next:longint; end; var edge1,edge2:..maxn] of ...

  8. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  9. BZOJ 题解continue

    1041 圆上的整点 暴力枚举 会超时 这道题很像之前一次noip模拟题(当时的我还太水了(虽然现在也很水)) x2+y2=R2 考虑变型 x2=(R+y)(R-y) int d=gcd(R,y) i ...

  10. 【Tarjan】+【SPFA】APIO2009 Atm

    一.算法介绍 tarjan——求解有向图强连通分量.这个算法在本人的一篇blog中有介绍,这里就不赘述了.贴上介绍tarjan的的blog链接:http://www.cnblogs.com/Maki- ...

随机推荐

  1. Vue源码学习(六):(支线)渲染函数中with(),call()的使用以及一些思考

    好家伙,   昨天,在学习vue源码的过程中,看到了这个玩意 嘶,看不太懂,研究一下   1.上下文 这段出现vue模板编译的虚拟node部分 export function renderMixin( ...

  2. 全网最详细Java-JVM

    Java-JVM ①JVM概述 ❶基本介绍 JVM:全称 Java Virtual Machine,一个虚拟计算机,Java 程序的运行环境(Java二进制字节码的运行环境) 特点: Java 虚拟机 ...

  3. Solution Set -「NOI Online R1」

    NOI-Online-T1-序列 其实这道题是全场最难的-- 我这里给出一种并查集的做法. 首先我们把操作2中的 \(u\) 和 \(v\) 合并 对于操作1我们可以把他转化为操作2来做. 比如我们针 ...

  4. git升级编译安装

    一.删除旧版本git 方法一. yum remove git -y (centos环境) apt-get remove git -y (Ubuntu环境) 方法二. which git [root@p ...

  5. 【python】python开源代理ip池

    一.前言 随着互联网的不断发展,越来越多的应用需要使用高匿代理IP才能访问目标网站,而代理IP作为一种能够隐藏本机真实IP地址的工具,在网络抓取.搜索引擎排名.广告投放.反爬虫等方面有着广泛的应用场景 ...

  6. [GXYCTF 2019]BabyUpload

    看到题目是一个文件上传 就先随便传的东西试试,看有什么过滤之类的 上传一个一句话木马,提示后缀名不能为ph 随便上传了带有一句话木马的图片,发现上传成功,但这个图片不能直接利用,要先上传一个.htac ...

  7. 【PHP正则表达式】

    [PHP正则表达式] 最近写题总是遇到php正则表达式的匹配函数,于是进行一个总结. 1.什么是正则表达式 是php在进行搜索时用于匹配的模式字符串.一般用于php对特定字符序列的替换和搜索. 2.正 ...

  8. 神经网络入门篇:详解多样本向量化(Vectorizing across multiple examples)

    多样本向量化 与上篇博客相联系的来理解 逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算.神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值.这种计算是所有的训练样本同时进行的 ...

  9. ZYNQ国产化替代-FMQL100TAI 核心板

     概述 FMQL100TAI 核心板基于复旦微的PSOC 架构处理器,型号为FMQL100TAI9000, 板卡 100%采用国产芯片设计,板卡质量等级分为国产 I 级和国产 J 级.具备强大的运算能 ...

  10. go并发 - goroutine

    概述 Go并发模型独树一帜,简洁.高效.Go语言最小执行单位称为协程(goroutine),运行时可以创建成千万上个协程,这在Java.C等线程模型中是不可想象的,并发模型是Go的招牌能力之一.很多文 ...