洛谷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)的更多相关文章

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

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

  2. 洛谷 P3627 [APIO2009]抢掠计划 题解

    Analysis 建图+强连通分量+SPFA求最长路 但要保证最后到达的点中包含酒馆 虽然思路并不难想,但要求的代码能力很高. #include<iostream> #include< ...

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

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

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

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

  5. 洛谷 P3627 【抢掠计划】

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

  6. BZOJ1179或洛谷3672 [APIO2009]抢掠计划

    BZOJ原题链接 洛谷原题链接 在一个强连通分量里的\(ATM\)机显然都可被抢,所以先用\(tarjan\)找强连通分量并缩点,在缩点的后的\(DAG\)上跑最长路,然后扫一遍酒吧记录答案即可. # ...

  7. 洛谷3627 [APIO2009]抢掠计划

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

  8. P3627 [APIO2009]抢掠计划

    P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...

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

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

随机推荐

  1. pulic——function(下载的公共的)

    1. /* * 用途: 对Date的扩展,将 Date 转化为指定格式的String */ // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年( ...

  2. 使用selenium时碰到的某一个坑

    如图:

  3. HTML的注释方式对JSP的JSTL不管用

    <fmt:parseNumber var="y" integerOnly="true" type="number" value=&qu ...

  4. SpringSecurity 3.2入门(10)自定义权限控制认证及授权的过程

    上一章的代码实现还存在一些问题,如角色表.权限表的用处没有体现出来,但是已经能完成URL拦截功能,后面将会继续完善认证及授权的过程. 认证及授权的过程如下: 1.容器启动,MyInvocationSe ...

  5. Android活动的启动模式

    1. standard 标准模式,是活动默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种模式. Android使用返回栈管理活动,在standard模式下,每当启动一个新的活动,它就 ...

  6. linux系统设置虚拟内存

    1. 情景:centos7源码编译mysql5.7.22时,因为服务器内存不足导致编译失败(源码编译至少需要1G内存).报错信息如下: c++: Internal error: Killed (pro ...

  7. Android 仿iPhone的日期时间选择器

    可选只选择日期,也可以同时选择时间 只选择日期的情况 同时选择日期和时间的情况 关键代码: findViewById(R.id.selectDateButton).setOnClickListener ...

  8. ubuntu怎么关防火墙

    1.关闭ubuntu的防火墙 ufw disable2.卸载了iptables apt-get remove iptables 1.用iptables -F这个命令来关闭防火墙,但是使用这个命令前,千 ...

  9. 用AutoHotkey一键完成Xmind里的几个功能

    F5一键添加超链接(类型为主题),常规步骤:Ctrl_h打开窗口,点击[主题],激活光标到输入框. Ctrl-i一键添加截取的图片,常规步骤是:打开画图→粘贴→保存图片为文件→Xmind里Ctrl-i ...

  10. June 12th 2017 Week 24th Monday

    All the splendor in the world is not worth a good friend. 人世间所有的荣华富贵都比不上有一个好朋友. It's great to have a ...