1179: [Apio2009]Atm

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 2069  Solved: 826
[Submit][Status][Discuss]

Description

Input

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

Output

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

Sample Input

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

Sample Output

47

HINT

50%的输入保证N, M<=3000。所有的输入保证N, M<=500000。每个ATM机中可取的钱数为一个非负整数且不超过4000。输入数据保证你可以从市中心沿着Siruseri的单向的道路到达其中的至少一个酒吧。

题解:先对图缩点,再求最大值路径就好了跑tarjan后重建图再跑spfa就可以AC

///
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#include<bitset>
#include<set>
#include<vector>
using namespace std ;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,127,sizeof(a));
#define memfy(a) memset(a,-1,sizeof(a));
#define TS printf("111111\n");
#define FOR(i,a,b) for( int i=a;i<=b;i++)
#define FORJ(i,a,b) for(int i=a;i>=b;i--)
#define READ(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mod 1000000007
#define inf 100000000
inline ll read(){ll x=,f=;char ch=getchar();while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}return x*f;}
//****************************************
#define maxn 500000+5
int pub,hav[maxn],s,top,vis[maxn],head[maxn],dist[maxn],belong[maxn],value[maxn],va[maxn],t,inq[maxn],q[maxn],scc,cnt;
int dfn[maxn],n,m,p,low[maxn],hea[maxn];
struct ss
{
int to,next,u;
}e[maxn*],newe[maxn*];
void init()
{
mem(head);mem(vis);scc=;mem(hav);mem(hea);
t=;cnt=;top=;mem(va);mem(dist);
}
void add(int u,int v)
{
e[t].next=head[u];
e[t].to=v;
e[t].u=u;
head[u]=t++;
}
void addd(int u,int v)
{
newe[t].to=v;
newe[t].next=hea[u];
hea[u]=t++;
}
void dfs(int x)
{
vis[x]=inq[x]=;
low[x]=dfn[x]=++cnt;
q[++top]=x;
for(int i=head[x];i;i=e[i].next)
{
if(!vis[e[i].to])
{
dfs(e[i].to);
low[x]=min(low[x],low[e[i].to]);
}
else if(inq[e[i].to]) low[x]=min(low[x],dfn[e[i].to]);
}
int v=-;
if(low[x]==dfn[x])
{
scc++;
while(v!=x)
{
v=q[top--];
inq[v]=;
belong[v]=scc;
hav[scc]+=value[v];
}
}
}
void tarjan()
{
FOR(i,,n)if(!vis[i])dfs(i);
t=;mem(hea);
FOR(i,,n)
{
for(int j=head[i];j;j=e[j].next){
if(belong[e[j].to]!=belong[i])
addd(belong[i],belong[e[j].to]);
}
}
}
void spfa()
{
queue<int >Q;
Q.push(belong[s]);
inq[belong[s]]=;
dist[belong[s]]=hav[belong[s]];
while(!Q.empty())
{
int k=Q.front();
Q.pop();
inq[k]=;
for(int i=hea[k];i;i=newe[i].next)
{
if(dist[k]+hav[newe[i].to]>dist[newe[i].to])
{
dist[newe[i].to]=dist[k]+hav[newe[i].to];
if(!inq[newe[i].to])
{
inq[newe[i].to]=;
Q.push(newe[i].to);
}
}
}
} }
int main()
{ n=read();
m=read();
int a,b;
init();
FOR(i,,m)
{
scanf("%d%d",&a,&b);
add(a,b);
}
FOR(i,,n)scanf("%d",&value[i]);
tarjan();
s=read();
p=read();
spfa();
int ans=-;
FOR(i,,p)
{
scanf("%d",&pub);
ans=max(ans,dist[belong[pub]]);
}
cout<<ans<<endl;
return ;
}

代码

BZOJ1179 : [Apio2009]Atm 缩点+spfa的更多相关文章

  1. bzoj1179 [Apio2009]Atm——缩环最长路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 tarjan 缩环,然后求到有酒吧的点的最长路即可: 但一开始想缩环后用拓扑序求答案, ...

  2. [BZOJ1179][APIO2009][强连通分量Tarjan+spfa]ATM

    [BZOJ1179][APIO2009]ATM Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i ...

  3. BZOJ1179 [Apio2009]Atm 【tarjan缩点】

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4048  Solved: 1762 [Submit][Sta ...

  4. bzoj 1179 [Apio2009]Atm 缩点+最短路

    [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 4290  Solved: 1893[Submit][Status][Dis ...

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

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

  6. 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm

    缩点后转化成 DAG图上的单源最长路问题.spfa/dp随便. #include<cstdio> #include<queue> #include<algorithm&g ...

  7. [BZOJ1179] [Apio2009]Atm(tarjan缩点 + spfa)

    传送门 题意 N个点M条边的有向图 每个点有点权 从某一个结点出发 问能获得的最大点权和 一个点的点权最多被计算一次 N<=500000 M<=500000 思路 先tarjan缩点,然后 ...

  8. 【强连通分量+spfa】Bzoj1179 Apio2009 Atm

    Description Solution 显然缩强连通分量,然后求最长路,虽然是DAG但还是有点麻烦,于是用了spfa. Code 重建图_数组写错好多次,感觉做这题也就是练了一下实现. #inclu ...

  9. BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1179 题意概括 有一个有向图,每一个节点有一个权值,其中有一些结束点. 现在,你要从S出发,到达任 ...

随机推荐

  1. 零基础入门学习Python(27)--集合:在我的世界里,你就是唯一

    知识点 集合:set set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key. 集合中的元素的三个特征: 1)确定性(元素必须可hash ...

  2. php-fpm进程数管理

    PHP-FPM 先来了解一些名词概念: CGI是Common Gateway Interface(通用网管协议),用于让交互程序和Web服务器通信的协议.它负责处理URL的请求,启动一个进程,将客户端 ...

  3. PHP:车牌照合法性

    文章来源:http://www.cnblogs.com/hello-tl/p/7592362.html <?php /** * [verifyCarCard description] 效验车牌号 ...

  4. loaction.reload(false)和location.reload(true) js发起请求

    loaction.reload(false)和location.reload(true)差别: loaction.reload(false) 先判断页面有没修改,有的话就从服务器下载页面,没有就直接从 ...

  5. Uva 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)

    题意: 给定一个H行W列的字符矩阵(H<200, W < 50), 输入的是一个十六进制字符, 代表一行四个相邻的二进制, 1代表像素, 0代表没有像素. 然后要求判断输入的是以下哪些图形 ...

  6. MySQL Foreign Key

    ntroduction to MySQL foreign key A foreign key is a field in a table that matches another field of a ...

  7. POJ1094 字母排序(拓扑排序)

    该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.该序列不能判断是否有序: 3.该序列字母次 ...

  8. [Nescafé 20] 玉蟾宫

    ★   输入文件:jademoon.in   输出文件:jademoon.out   简单对比 时间限制:1 s   内存限制:128 MB [背景] 有一天,小猫rainbow和freda来到了湘西 ...

  9. 使用GSON解析JSON文件

    package com.pingyijinren.test; /** * Created by Administrator on 2016/5/19 0019. */ public class App ...

  10. hdu - 2851 Lode Runner (最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=2851 首先有n层,每层的路径都有一个起点和终点和对应的危险值,如果某两层之间有交集,就能从这一层上到另外一层,不 ...