P3627 [APIO2009]抢掠计划

Tarjan缩点+最短(最长)路

显然的缩点......

在缩点时,顺便维护每个强连通分量的总权值

缩完点按照惯例建个新图

然后跑一遍spfa最长路,枚举每个有酒吧的点即可

(但是我为什么会搞dp呢.......)

dp:81pts

(这么显然的最长路,为什么会搞dp呢.........)

怕不是被dp题毒害了(大雾)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cctype>
using namespace std;
template <typename T> inline T min(T &a,T &b) {return a<b ?a:b;}
template <typename T> inline T max(T &a,T &b) {return a>b ?a:b;}
template <typename T> inline void read(T &x){
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
}
queue <int> h;
const int N=;
int n,m,s,p,dfs_clock,dfn[N],low[N],tot,be[N],_top,st[N];
int val1[N],cnt,hd[N],nxt[N],ed[N],poi[N];
int val2[N],cnt2,hd2[N],nxt2[N],ed2[N],poi2[N];
int d[N]; bool bar1[N],bar2[N],vis[N];
inline void add(int x,int y){
nxt[ed[x]]=++cnt; hd[x]= hd[x] ? hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y;
}
inline void add2(int x,int y){
nxt2[ed2[x]]=++cnt2; hd2[x]= hd2[x] ? hd2[x]:cnt2;
ed2[x]=cnt2; poi2[cnt2]=y;
}
inline void tarjan(int x){
dfn[x]=low[x]=++dfs_clock; st[++_top]=x;
for(int i=hd[x];i;i=nxt[i]){
if(!dfn[poi[i]]) tarjan(poi[i]),low[x]=min(low[x],low[poi[i]]);
else if(!be[poi[i]]) low[x]=min(low[x],dfn[poi[i]]);
}
if(dfn[x]==low[x]){
be[x]=++tot; val2[tot]=val1[x];
while(st[_top]!=x) be[st[_top]]=tot,val2[tot]+=val1[st[_top--]]; //维护总权值
--_top;
}
}
int spfa(){
h.push(be[s]); vis[be[s]]=;
while(!h.empty()){
int x=h.front(); h.pop(); vis[x]=;
for(register int i=hd2[x];i;i=nxt2[i])
if(d[x]+val2[x]>d[poi2[i]]){ //最长路
d[poi2[i]]=d[x]+val2[x];
if(!vis[poi2[i]]) h.push(poi2[i]),vis[poi2[i]]=;
}
}int ans=;
for(register int i=;i<=tot;++i) //枚举有酒吧的强连通分量
if(bar2[i])
ans=max(ans,d[i]+val2[i]);
return ans;
}
int main(){
read(n); read(m); int q1,q2;
for(register int i=;i<=m;++i) read(q1),read(q2),add(q1,q2);
for(register int i=;i<=n;++i) read(val1[i]);
read(s); read(p);
for(register int i=;i<=p;++i) read(q1),bar1[q1]=;
for(register int i=;i<=n;++i) if(!dfn[i]) tarjan(i);
for(register int i=;i<=n;++i){
if(bar1[i]) bar2[be[i]]=; //给新图做上是否有酒吧的标记
for(register int j=hd[i];j;j=nxt[j])
if(be[i]!=be[poi[j]])
add2(be[i],be[poi[j]]);
}printf("%d",spfa());
return ;
}

P3627 [APIO2009]抢掠计划的更多相关文章

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

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

  2. 【luogu P3627 [APIO2009]抢掠计划】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3627 把点权转化到边权上去. #include <stack> #include <que ...

  3. 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)

    洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...

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

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

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

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

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

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

  7. 题解 P3627 【[APIO2009]抢掠计划】

    咕了四个小时整整一晚上 P3627 [APIO2009] 抢掠计划(https://www.luogu.org/problemnew/show/P3627) 不难看出答案即为该有向图的最长链长度(允许 ...

  8. APIO2009 抢掠计划 Tarjan DAG-DP

    APIO2009 抢掠计划 Tarjan spfa/DAG-DP 题面 一道\(Tarjan\)缩点水题.因为可以反复经过节点,所以把一个联通快中的所有路口看做一个整体,缩点后直接跑\(spfa\)或 ...

  9. [APIO2009]抢掠计划(Tarjan,SPFA)

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

随机推荐

  1. Linux下 磁盘扩容的两种方式

    Hadoop扩容 概述 Hadoop存储容量或计算能力不能满足日益增长的需求时,就需要扩容. 扩容有两个方案: 1) 增加磁盘 2) 增加节点 方案一:扩大虚拟磁盘 扩大容量 将虚拟的Linux关闭, ...

  2. Mongodb之使用rpm包安装配置启动

    下载rpm包 wget https://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.2/x86_64/RPMS/mongod ...

  3. Master Boot Record

    https://en.wikipedia.org/wiki/Master_boot_record https://zh.wikipedia.org/wiki/主引导记录 A master boot r ...

  4. table 的td 自适应事项

    media的html结构,如果用display:table-cell实现, table { width: 100%; border-collapse: collapse; border: $bor; ...

  5. java获取系统当前服务器IP地址

    public String getServiceIp(){ InetAddress address; String myIp; try { address = InetAddress.getLocal ...

  6. python中执行shell命令行read结果

    +++++++++++++++++++++++++++++ python执行shell命令1 os.system 可以返回运行shell命令状态,同时会在终端输出运行结果 例如 ipython中运行如 ...

  7. java获取屏幕密度

    方法1: float xdpi = getResources().getDisplayMetrics().widthPixels;float ydpi = getResources().getDisp ...

  8. Spark性能优化(一)

    前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...

  9. CentOS忘记普通用户密码解决办法

    普通用户忘记密码 1.使用root用户登录系统,找到/etc/shadow文件. 2.找到用户名开头的那一行,例如我的用户名为pds,,以冒号为分割符,红色部分是密码加密部分 pds:$1$Civop ...

  10. VS2013密钥(所有版本)

    Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥) ...