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. msql_createdb: 建立一个新的 mSQL 数据库。

    mcrypt_ecb: 使用 ECB 将资料加/解密. mcrypt_get_block_size: 取得编码方式的区块大小. mcrypt_get_cipher_name: 取得编码方式的名称. m ...

  2. Saltstack之SaltSyndic

    SaltSyndic 1,SaltSyndic必须运行在salt-master上面 2,Syndic要连接另外一个Master比它更高级 在master安装syndic yum -y install ...

  3. 牛客网多校赛第九场A-circulant matrix【数论】

    链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  4. 开放思源 专注高效 HPE&msup软件技术开放日回顾

    7月22日,HPE和msup联合举办的软件技术开放日在上海浦东新区张江高科技园区召开,主.分会场共邀请HPE 13 名测试.质量.大数据专家分享技术实践与经验,与180多名测试总监一起拆解质量保障及大 ...

  5. HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  6. Codeforces 349C - Mafia

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  7. InfluxDB通过HTTP API

    SELECT "value" FROM "online_user_counter" curl -POST http://localhost:8086/query ...

  8. linux系统下添加计划任务执行php文件方法

    在web开发过程中,经常需要设定一些定期执行的任务,比如商品定时上下架.我们以php文件为例,讲解linux下的计划任务,来看看吧   在web开发过程中,经常需要设定一些定期执行的任务,比如商品定时 ...

  9. es新增字段,并设置默认值

    重新设置mapping 添加新的字段. 设置es允许脚本执行:elasticsearch.yml script.inline: true 然后执行脚本 POST linewell_assets_mgt ...

  10. 洛谷P1494小Z的袜子 [国家集训队] 莫队

    正解:莫队 解题报告: 这是,传送门qwq 昂大概是莫队板子题? 首先可以推出来答案是(∑C(2,color[i]))/C(2,r-l+1)趴?挺显然的不解释了qwq 然后显然除数直接做就成,考虑怎么 ...