题目描述

输入

第一行包含两个整数N、M。N表示路口的个数,M表示道路条数。接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号。接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数。接下来一行包含两个整数S、P,S表示市中心的编号,也就是出发的路口。P表示酒吧数目。接下来的一行中有P个整数,表示P个有酒吧的路口的编号

输出

输出一个整数,表示Banditji从市中心开始到某个酒吧结束所能抢劫的最多的现金总数。

样例输入

6 7
1 2
2 3
3 5
2 4
4 1
2 6
6 5
10
12
8
16
1 5
1 4
4
3
5
6

样例输出

47


题解

Tarjan缩点+Spfa最长路

首先每个强连通分量中的所有点都可以相互经过且只能获得一次点权,所以需要先用Tarjan缩点再跑最长路。

这里懒了直接跑了Spfa,其实拓扑排序+dp应该更快

#include <cstdio>
#include <queue>
#define N 500010
using namespace std;
queue<int> q;
struct data
{
int head[N] , to[N] , next[N] , cnt , v[N];
void add(int x , int y)
{
to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
}A , B;
int deep[N] , low[N] , tot , sta[N] , ins[N] , vis[N] , top , bl[N] , num , f[N] , dis[N] , inq[N];
void tarjan(int x)
{
int i;
deep[x] = low[x] = ++tot , sta[++top] = x , vis[x] = ins[x] = 1;
for(i = A.head[x] ; i ; i = A.next[i])
{
if(!vis[A.to[i]]) tarjan(A.to[i]) , low[x] = min(low[x] , low[A.to[i]]);
else if(ins[A.to[i]]) low[x] = min(low[x] , deep[A.to[i]]);
}
if(deep[x] == low[x])
{
int t;
num ++ ;
do
{
t = sta[top -- ];
bl[t] = num , ins[t] = 0;
B.v[bl[t]] += A.v[t];
}while(t != x);
}
}
void spfa(int s)
{
int x , i;
dis[s] = B.v[s] , q.push(s);
while(!q.empty())
{
x = q.front() , q.pop() , inq[x] = 0;
for(i = B.head[x] ; i ; i = B.next[i])
{
if(dis[B.to[i]] < dis[x] + B.v[B.to[i]])
{
dis[B.to[i]] = dis[x] + B.v[B.to[i]];
if(!inq[B.to[i]]) inq[B.to[i]] = 1 , q.push(B.to[i]);
}
}
}
}
int main()
{
int n , m , i , j , x , y , ans = 0;
scanf("%d%d" , &n , &m);
while(m -- ) scanf("%d%d" , &x , &y) , A.add(x , y);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &A.v[i]);
for(i = 1 ; i <= n ; i ++ ) if(!vis[i]) tarjan(i);
for(i = 1 ; i <= n ; i ++ )
for(j = A.head[i] ; j ; j = A.next[j])
if(bl[i] != bl[A.to[j]])
B.add(bl[i] , bl[A.to[j]]);
scanf("%d%d" , &x , &y) , spfa(bl[x]);
while(y -- ) scanf("%d" , &x) , ans = max(ans , dis[bl[x]]);
printf("%d\n" , ans);
return 0;
}

【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路的更多相关文章

  1. bzoj1179: [Apio2009]Atm 【缩点+spfa最长路】

    题目传送门 Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的是,S ...

  2. Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划

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

  3. [luogu3627 APIO2009] 抢掠计划 (tarjan缩点+spfa最长路)

    传送门 Description Input 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表 ...

  4. 【BZOJ1179】 [Apio2009]Atm tarjan缩点+SPFA

    Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口 ...

  5. 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm

    [bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...

  6. bzoj 1179 [Apio2009]Atm——SCC缩点+spfa

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 显然SCC缩点. 然后准备倒着拓扑序推到st,结果WA. 听TJ说dj求最长路会发生不 ...

  7. bzoj1179: [Apio2009]Atm scc缩点+dag上dp

    先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...

  8. Grouping ZOJ - 3795 (tarjan缩点求最长路)

    题目链接:https://cn.vjudge.net/problem/ZOJ-3795 题目大意:给你n个人,m个关系, 让你对这个n个人进行分组,要求:尽可能的分组最少,然后每个组里面的人都没有关系 ...

  9. BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)

    5450: 轰炸 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 43  Solved:18[Submit][Status][Discuss] Desc ...

随机推荐

  1. vue中登录模块的插件封装

    一个电商城的项目,场景是:在未登录的情况下点击收藏或者加入购物车等操作,执行一个方法如this.$login()来动态插入登录组件. 第一步:写好关于这个登录弹窗的单文件组件 loginBox.vue ...

  2. C/C++程序基础 (十一)标准模板库

    标准模板库 标准模板库在标准函数库的定位 迭代器(类似指针)保证算法(常用算法)和容器(数据结构)的结合. vector的实现 底层实现是动态数组,所以支持随机访问. 内部是动态数组,随着insert ...

  3. harbor 配置 Keepalived 实现HA

    环境说明: $ cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) vip : 192 168 93 142 MASTER-har ...

  4. MySQL跟踪SQL&慢查询分析工具

    简介 之前的工作一直使用的SQL SERVER, 用过的都知道,SQL SERVER有配套的SQL跟踪工具SQL Profiler,开发或者定位BUG过程中,可以在操作页面的时候,实时查看数据库执行的 ...

  5. java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗?

    问.java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗? 答:没有区别,jdk5 和 jdk1.5 所代表的意思是一样的,只是叫法不一样 关键字: jdk5 j ...

  6. 再次写给VC++ Windows开发者

    距离我的上一篇文章--写给VC++ Windows开发的初学者已经4年多时间过去了,感慨于时光如梭之余,更感慨于这么多年来(从1998年我初学VC 算起吧)到如今其实我仍然还只是个初学者而已.看看之前 ...

  7. stat.h头文件,轻松获取文件属性

    [以前还为了获取文件的长度,费劲从头读取一遍,一个一个字节的算. 做webserver时候,发现原来stat函数可以返回一个结构,里面包括文件的全部属性. 真是曲折啊.] #i nclude<s ...

  8. iar注释快捷键

    选中多行后注释快捷键:Ctrl+K 取消多行注释快捷键:Ctrl+Shift+K

  9. 裸机——RTC

    1. 首先晓得RTC的基本知识 RTC被划分到timer,但RTC是面向时间点的. 如果按照定时器的思路去思考,那么应该考虑 时间周期 和 计数值. RTC 不是面向时间点的,所以略有不同, 时间周期 ...

  10. Card Hand Sorting 18中南多校第一场C题

    一.题意 随机给你一堆牌(标准扑克牌),之后让你按照: 第一优先规则:所有相同花色的在一起 第二优先规则:所有相同花色的必须按照升序或者降序排列 问,你最少要拿出多少张牌插入到其他的地方以维持这个状况 ...