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. Ubuntu16.04下安装配置numpy,scipy,matplotlibm,pandas 以及sklearn+深度学习tensorflow配置+Keras2.0.6(非Anaconda环境)

    1.ubuntu镜像源准备(防止下载过慢): 参考博文:http://www.cnblogs.com/top5/archive/2009/10/07/1578815.html 步骤如下: 首先,备份一 ...

  2. 用栈来递归 模板 honoi

    用栈来模拟递归的技巧 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> #include& ...

  3. web移动端开发经验总结

    整理web移动端开发经验,部分内容借鉴于网上的博文. 1.meta标签 <meta name="viewport" content="width=device-wi ...

  4. 2015 湘潭大学程序设计比赛(Internet)H题-括号匹配

    括号匹配 Accepted : 30   Submit : 234 Time Limit : 10000 MS   Memory Limit : 65536 KB 题目描述 有一串括号(只包含&quo ...

  5. 洛谷P1967 货车运输 [noip2013] 图论

    正解:kruskal+LCA 解题报告: 哇真实心痛了...明明都没多少时间了我居然耗了一个上午+一个中午在上面?哭死辽我QAQ果然菜是原罪QAQ 然后这题,我先港下60pts做法趴?话说其实我觉得我 ...

  6. javaScript 载入自执行

    1.注册可以直接调用f()中的b(),c(),d() .原因?自己想. <!DOCTYPE html> <html> <head> <meta charset ...

  7. xpath教程 2 - lxml库

    xpath教程 2 - lxml库 这些就是XPath的语法内容,在运用到Python抓取时要先转换为xml. lxml库 lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HT ...

  8. android 打开系统相机,

    1.第一步在androidmanifest.xml中注册 <uses-permission android:name="android.permission.WRITE_EXTERNA ...

  9. Prometheus+Grafana+Altermanager搭建监控系统

    基本概念 Prometheus 时间序列化数据库,我的理解就是将数据打上标签,以时间维度存储.后面有机会在深入研究. Prometheus架构如下: Grafana Prometheus中存储的数据, ...

  10. Message Flood(map)

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=203#problem/D 以前用字典树做过 #include <strin ...