【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)
洛谷P3627:https://www.luogu.org/problemnew/show/P3627
思路
由于有强连通分量 所以我们可以想到先把整个图缩点
缩点完之后再建一次图 把点权改为边权 并把边权转为负数 即可用SPFA求最短路间接求最长路了
最后我们查询所有的酒吧 跳出最大的ans即可
思路简单 但是代码有些冗长
代码
- #include<iostream>
- #include<cstring>
- using namespace std;
- #define maxn 500010
- int n,m,s,p,top,num,cnt,col,ans,t,w;
- int h[maxn],de[maxn],st[maxn],dfn[maxn],low[maxn],co[maxn],money[maxn],sum[maxn],q[maxn],dis[maxn],x[maxn],y[maxn];
- bool vis[maxn],exist[maxn];
- struct Edge
- {
- int to;
- int next;
- int w;
- }e[maxn];
- void add(int u,int v)//Tarjan的边
- {
- e[++cnt].to=v;
- e[cnt].next=h[u];
- h[u]=cnt;
- }
- void read()//输入
- {
- cin>>n>>m;
- for(int i=;i<=m;i++)
- {
- cin>>x[i]>>y[i];
- add(x[i],y[i]);
- }
- for(int i=;i<=n;i++)
- cin>>money[i];
- cin>>s;
- }
- void Add(int u,int v,int w)//SPFA的边
- {
- e[++cnt].w=w;
- e[cnt].to=v;
- e[cnt].next=h[u];
- h[u]=cnt;
- }
- void Tarjan(int u)//标准Tarjan
- {
- dfn[u]=low[u]=++num;
- vis[u]=;
- st[++top]=u;
- for(int i=h[u];i;i=e[i].next)
- {
- int v=e[i].to;
- if(!dfn[v])
- {
- Tarjan(v);
- low[u]=min(low[u],low[v]);
- }
- else
- if(vis[v])
- {
- low[u]=min(low[u],dfn[v]);
- }
- }
- if(dfn[u]==low[u])
- {
- col++;
- while(st[top+]!=u)
- {
- sum[col]+=money[st[top]];//计算此强连通分量的总价值
- co[st[top]]=col;
- vis[st[top--]]=;
- }
- }
- }
- void SPFA()//标准SPFA
- {
- memset(dis,,sizeof(dis));
- dis[co[s]]=-sum[co[s]];//负权
- q[]=co[s];//把市中心所在的点入队
- t=;
- w=;
- while(t<w)
- {
- t++;
- int u=q[t];
- exist[u]=;
- for(int i=h[u];i;i=e[i].next)
- {
- int v=e[i].to;
- if(dis[v]>dis[u]+e[i].w)
- {
- dis[v]=dis[u]+e[i].w;
- if(!exist[v])
- {
- w++;
- q[w]=v;
- exist[v]=;
- }
- }
- }
- }
- }
- int main()
- {
- read();
- for(int i=;i<=n;i++)
- if(!dfn[i]) Tarjan(i);
- cnt=;
- memset(e,,sizeof(e));
- memset(h,,sizeof(h));//注意清空边
- for(int i=;i<=m;i++)
- if(co[x[i]]!=co[y[i]])
- Add(co[x[i]],co[y[i]],-sum[co[y[i]]]);//负权边
- SPFA();
- cin>>p;
- for(int i=;i<=p;i++)//枚举所有酒吧求最大值
- {
- int bar;
- cin>>bar;
- if(-dis[co[bar]]>ans)
- ans=-dis[co[bar]];
- }
- cout<<ans;
- }
【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)的更多相关文章
- 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路
题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...
- 洛谷 P3627 [APIO2009]抢掠计划 题解
Analysis 建图+强连通分量+SPFA求最长路 但要保证最后到达的点中包含酒馆 虽然思路并不难想,但要求的代码能力很高. #include<iostream> #include< ...
- [洛谷P3627][APIO2009]抢掠计划
题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...
- 洛谷 P3627 [APIO2009]抢掠计划
这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...
- 洛谷 P3627 【抢掠计划】
题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...
- BZOJ1179或洛谷3672 [APIO2009]抢掠计划
BZOJ原题链接 洛谷原题链接 在一个强连通分量里的\(ATM\)机显然都可被抢,所以先用\(tarjan\)找强连通分量并缩点,在缩点的后的\(DAG\)上跑最长路,然后扫一遍酒吧记录答案即可. # ...
- 洛谷3627 [APIO2009]抢掠计划
题目描述 输入格式: 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表示第 i 条道路的起点 ...
- P3627 [APIO2009]抢掠计划
P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...
- 洛谷 P3627 [APIO2009](抢掠计划 缩点+spfa)
题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...
随机推荐
- 解决 command not found: express
需要先执行 sudo npm install -g express-generator 再安装 sudo npm install -g express 建立项目骨架 express -e xxx
- c#输入方法名来调用方法(反射)
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...
- http反向代理之haproxy详解
1.反向代理定义 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...
- spring 依赖注入总结--为什么官方推荐构造器注入
一 公司小伙伴使用了构造器注入,说是spring的官方推荐.但是,我问了三个问题,他都答不出来,感觉能写篇博文. 官方为什么推荐构造器注入? 构造器注入和属性注入的区别是啥? 你知道有几种注入方式吗? ...
- linux服务器git pull/push时避免频繁输入账号密码
1.先cd到根目录,执行git config --global credential.helper store命令 [root@iZ25mi9h7ayZ ~]# git config --global ...
- 【VirtualBox】快照
一.快照备份 虚拟机系统快照下来,以后就可以恢复到快照之前的系统 右上角->虚拟电脑工具->快照
- smarty中函数的使用以及二维数组的使用
1.虽然讲究前后台分离,但是如果如果有的项目,前后台分离的不彻底,或者有些必须要在HTML中处理,还是要用到PHP中的函数的: <% if $Role|in_array:$menuRole[$c ...
- 04.Path类的学习
path 是路径的意思. path类是一个静态类,所以path是一个工具类. Path类是专门用来操作路径的. Path的常用方法: namespace _15.Path类的学习 { class Pr ...
- 希尔排序——Java实现
一.排序思想 希尔排序(Shell’s Sort)是插入排序的一种,是直接插入排序算法的一种更高版本的改进版本. 把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序: 随着步长逐渐减小,所 ...
- SQLAlchemy的使用---M2M增删改查
from sqlalchemy.orm import sessionmaker from sqlalchemy_M2M import engine, Girls, Boys Session = ses ...