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. POJ 2723 HDU 1816 Get Luffy Out

    二分答案 + 2-SAT验证 #include<cstdio> #include<cstring> #include<cmath> #include<stac ...

  2. c# winform 点击按钮切换tabcontrol标签

    this.tabControl1.TabPages.Remove(tabPage1); this.tabControl1.TabPages.Remove(tabPage2); this.tabCont ...

  3. UIScrollView 和 UIPageControl

    UIScrollView [滚动视图]非常重要 UIScrollView是滚动视图,是其它带有滚动功能视图的父类, 本身不显示或者只显示背景,主要负责子视图的滚动和翻页. 一.常用属性 1.基本方法 ...

  4. 读取excel数据 到 datagrid 出现 找不到可安装的ISAM

    读取excel数据 到 datagrid 出现:找不到可安装的ISAM       错误: 实在没有办法了 就仔细的查看了 一下数据链接字符串: string strConn = "Prov ...

  5. AIDL原理解析

    首先为什么需要aidl? 下面是不需要aidl 的binder的IPC通讯过程,表面上结构很简单,但是有个困难就是,客户端和服务端进行通讯,你得先将你的通讯请求转换成序列化的数据,然后调用transa ...

  6. EasyUI中dialog中嵌入form细节问题记录

    当代码如下: function myClear() { $("#add_form").form("reset"); $("#add_dialog&qu ...

  7. 利用rem实现webapp布局

    rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了. 但是我对rem综合评价是用来做web app它绝对是最合适的人选之一 ...

  8. MAC 调整Launchpad 图标大小

    1.调整每一列显示图标数量 defaults write com.apple.dock springboard-rows -int 7 2.调整每一行显示图标数量 defaults write com ...

  9. springMVC源码下载地址

    https://github.com/spring-projects/spring-framework/tags可以选择需要的版本进行下载.

  10. Xcode 6配置里定义${ARCHS_STANDARD}为armv7, arm64以及错误

    转发:http://www.cocoachina.com/ios/20141013/9897.html 最近一次的Xcode 6更新默认不再支持arm7s架构,究竟是要废除不用呢还是仅仅只是一个疏忽? ...