【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路
题目描述

输入
第一行包含两个整数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最长路的更多相关文章
- bzoj1179: [Apio2009]Atm 【缩点+spfa最长路】
题目传送门 Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的是,S ...
- Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划
Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri ...
- [luogu3627 APIO2009] 抢掠计划 (tarjan缩点+spfa最长路)
传送门 Description Input 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表 ...
- 【BZOJ1179】 [Apio2009]Atm tarjan缩点+SPFA
Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口 ...
- 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm
[bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...
- bzoj 1179 [Apio2009]Atm——SCC缩点+spfa
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 显然SCC缩点. 然后准备倒着拓扑序推到st,结果WA. 听TJ说dj求最长路会发生不 ...
- bzoj1179: [Apio2009]Atm scc缩点+dag上dp
先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...
- Grouping ZOJ - 3795 (tarjan缩点求最长路)
题目链接:https://cn.vjudge.net/problem/ZOJ-3795 题目大意:给你n个人,m个关系, 让你对这个n个人进行分组,要求:尽可能的分组最少,然后每个组里面的人都没有关系 ...
- BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)
5450: 轰炸 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 43 Solved:18[Submit][Status][Discuss] Desc ...
随机推荐
- C语言结构体排序
定义学生信息结构体和结构体数组,包括学号.两门百分制成绩和姓名;键盘输入 学生不多于 30 人的信息,以输入成绩为负数或大于 100 作为输入结束;按照学号和平均成绩排序,并输出学生信息 //输入学生 ...
- 当Java遇见了Html--Jsp九大内置对象篇
jsp内置对象对象是web容器创建的一组对象,不使用new关键词久可以使用的内置对象. 九大内置对象包括以下: out --JspWriter request --ServletRequest rep ...
- java从图片中识别文字
package com.dream.common; import java.awt.image.BufferedImage; import java.io.File; import java.io.I ...
- MYSQL SQL高级查询技巧
1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...
- C语言函数篇(一)函数的组成
函数的组成: 函数名 输入参数 返回值 返回值 函数名 (输入参数){ 执行体 } 用指针保存函数: int func(int a, int b, char c){ } --> int (*fu ...
- SpringMVC文件上传——bean的配置【org.springframework.web.multipart.commons.CommonsMultipartResolver】
一.简介 Spring MVC支持一个通用的多路上传解析器CommonsMultipartResolver,在Spring的配置文件中对CommonsMultipartResolver Bean进行配 ...
- cocos2d-x 3.0环境配置(转)
cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑.每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大…… 但是凭心而论,3.0RC版本开始 ...
- SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID
如题: SDK location not found. Define location with sdk.dir in the local.properties file or with an AND ...
- 顺序查找&二分查找&索引查找
1.查找技术的分类.如下图: 2.什么是顺序查找呢?(无序表) 顺序查找的原理很简单,就是遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录.如 ...
- wireshark 安装
#yum install wireshark 安装完毕后 whereis wireshark 找不到可执行程序 /bin /sbin /usr/bin /usr/sbin下均没有. 实际上wiresh ...