SPFA算法

  1. SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法。
  2. 判负环(在差分约束系统中会得以体现)。如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图)

tarjan算法

Tarjan算法是用来求有向图的强连通分量的。

Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。
定义DFN(u)为节点u搜索的次序编号(时间戳),Low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号。
当DFN(u)=Low(u)时,以u为根的搜索子树上所有节点是一个强连通分量。
 
BZOJ 1179

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的单向的道路到达其中的至少一个酒吧。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; int n,m,st,p;
int ans;
int money[],moneys[];
int q[],b,e,d[];//spfa
int stack[],dfn[],low[],index,top;//tarjan
bool vis[];
int color[],num; struct node{
int u;
int v;
int next;
}s[],map[];
int head[],rehead[],cnt; void add(int x,int y){
s[++cnt].u=x;
s[cnt].v=y;
s[cnt].next=head[x];
head[x]=cnt;
} void tarjan(int x){
dfn[x]=++index;
low[x]=index;
stack[++top]=x;
vis[x]=true; for(int i=head[x];i!=;i=s[i].next){
if(!dfn[s[i].v]){
tarjan(s[i].v);
low[x]=min(low[x],low[s[i].v]);
}
else if(vis[s[i].v]==true)low[x]=min(low[x],dfn[s[i].v]);
} if(dfn[x]==low[x]){
vis[x]=false;
color[x]=++num;//计算个数
while(stack[top]!=x){
color[stack[top]]=num;
vis[stack[top--]]=false;
}
top--;
}
} void rebuild(){//缩点
cnt=;
for(int i=;i<=n;i++){
for(int j=head[i];j!=;j=s[j].next){
if(color[i]!=color[s[j].v]){
map[++cnt].u=color[i];
map[cnt].v=color[s[j].v];
map[cnt].next=rehead[color[i]];
rehead[color[i]]=cnt;
}
}
}
} void spfa(int x){
memset(vis,false,sizeof(vis));
q[++b]=x;
e++;
vis[x]=true;
d[x]=moneys[x];
while(b<=e){
int y=q[b++];
for(int i=rehead[y];i!=;i=map[i].next){
if(d[map[i].v]<d[y]+moneys[map[i].v]){
d[map[i].v]=d[y]+moneys[map[i].v];
if(!vis[map[i].v]){
q[++e]=map[i].v;
vis[map[i].v]=true;
}
}
}
vis[q[b]]=false;
}
} int main(){ scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
} for(int i=;i<=n;i++)
if(!dfn[i])tarjan(i); rebuild();//重建图 for(int i=;i<=n;i++){
scanf("%d",&money[i]);
moneys[color[i]]+=money[i];
} scanf("%d%d",&st,&p); spfa(color[st]); for(int i=;i<=p;i++){
int a;
scanf("%d",&a);
ans=max(ans,d[color[a]]);
}
printf("%d",ans); return ;
}

#图# #SPFA# #Tarjan# ----- BZOJ1179的更多相关文章

  1. [BZOJ2963][JLOI2011]飞行路线 分层图+spfa

    Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...

  2. 【bzoj2662】[BeiJing wc2012]冻结 分层图Spfa

    原文地址:http://www.cnblogs.com/GXZlegend 题目描述 “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„ ...

  3. BZOJ2330 糖果[差分约束方案+spfa?/tarjan]

    以往对于差分约束理解不是太深,导致这题屡次被坑,在此记录一下细节的理解. 差分约束实际上就是利用了spfa的一个特性:只要有$dis_y>dis_x+w_{x,y}$就松弛,直到所有边关系都满足 ...

  4. POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)

    /* bfs搜索!要注意的是点与点的权值是不一样的哦! 空地到空地的步数是1, 空地到墙的步数是2(轰一炮+移过去) 所以用到优先队列进行对当前节点步数的更新! */ #include<iost ...

  5. Invitation Cards(邻接表+逆向建图+SPFA)

    Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 17538   Accepted: 5721 Description In ...

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

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

  7. SHOI2008仙人掌图(tarjan+dp)

    Solution 好题啊没的说. 本题需要求出仙人掌的直径,但仙人掌是一个带有简单环的一张图无法直接用树形dp求解,但它有一个好东西就是没有类似环套环的东西,所以我们在处理时就方便了一些. 思路:ta ...

  8. poj 3177 Redundant Paths 求最少添加几条边成为双联通图: tarjan O(E)

    /** problem: http://poj.org/problem?id=3177 tarjan blog: https://blog.csdn.net/reverie_mjp/article/d ...

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

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

随机推荐

  1. Android复习--广播

    广播有两种方式,一种静态广播,一种动态广播. 静态广播-->静态广播接收器在配置文件里面注册. 动态广播-->而动态广播接收器在代码里面注册. 广播的发送: Context.sendBro ...

  2. linux下OpenOffice与SwfTools环境安装

    一.安装所需要的库与组件 yum install gcc* automake zlib-devel libjpeg-devel giflib-devel freetype-devel 二.安装open ...

  3. rsa or dsa?

    http://www.linuxquestions.org/questions/linux-security-4/which-is-better-rsa-or-dsa-public-key-12593 ...

  4. Codeforces #377 Div2

    打得还不错的一场CF,题目质量也很高,今后还要继续努力 A题: 题意:给定一个数k,让其乘一个最小的数,使乘得以后的数要不被10整除,要不减去r以后被10整除,求这个最小的数 #include < ...

  5. 读书笔记——Java IO

    IO流的典型使用方式 1.缓存输入文件 BufferedReader in=new BufferedReader( new FileReader(文件名字) ); String s; StringBu ...

  6. Linux iptables 防火墙详解

    0x00 iptables介绍 linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成. netfilter 组件也称为内核空间,是内核的一部分,由一些 ...

  7. matlab中gatbx工具箱的添加

    1. 从http://crystalgate.shef.ac.uk/code/下载工具箱压缩包gatbx.zip 2. 解压gatbx.zip,将其子文件夹genetic放在matlab安装目录too ...

  8. (中等) HDU 4979 A simple math problem. , DLX+重复覆盖+打表。

    Description Dragon loves lottery, he will try his luck every week. One day, the lottery company brin ...

  9. Java Base64、AES、SHA1、MD5加密算法(转载)

    package com.example.decript; import java.io.UnsupportedEncodingException; import java.security.Inval ...

  10. Laravel 使用简述

    开始使用laravel 在此之前我们需要修改一些配置: app/config/app.php 文件中的 debug 选项设置为 true (注:开启开发模式,更友好的开发提示:网站运行时则关闭): a ...