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. win7 以管理员身份运行cmd, windows services 的创建和删除

    以 http 协议访问svn repository 搭建可用http访问的svn(windows) http://blog.csdn.net/yangyangrenren/article/detail ...

  2. Android编程中的实用快捷键

    作为一个优秀的程序员,不但要能开发出漂亮的软件,也要能熟练掌握编程的技巧,包括IDE的快捷键使用.比如linux 下的VI编辑器,对于不熟练快捷键的人来说就是一个噩梦,但一旦你熟练了VI的快捷键,VI ...

  3. windows服务器下IIS7 安装URL Rewrite(URL重写)模块

    URL Rewrite Module是一个基于规则的URL重写引擎,用于在URL被Web服务器处理之前改变请求的URL.对于动态Web应用程序,它可以为用户和seo/seo.html" ta ...

  4. Android之ListView的快速滑动模式:fastScrollEnabled以及滑块的自定义

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0917/1690.html http://blog.csdn.net/xyang ...

  5. 对于形式参数只能用final修饰符,其它任何修饰符都会引起编译器错误

    在Java中修饰符总共有一下几种: 1.访问控制修饰符    分别有:public private protected,缺省 2.其它修饰符      分别有:abstract,final,stati ...

  6. (中等) POJ 2828 Buy Tickets , 逆序+线段树。

    Description: Railway tickets were difficult to buy around the Lunar New Year in China, so we must ge ...

  7. NSString的几个方法(rangeOfString,hasPrefix,hasSuffix,改变大小写...)

    - (NSRange)rangeOfString:(NSString *)searchString;//查找字符串中是包涵在某个字符串,并返回其开始位置和长度 例: NSRange range = [ ...

  8. Javascript 页面刷新

    Javascript 页面刷新的实现代码收藏 1 2 3 4 5 6 7 8 history.go(0) location.reload() location=location location.as ...

  9. S3C2440触摸屏驱动详解

    2440的触摸屏转换接口搭载在ADC接口之上,使用上比ADC接口多了一些花样,首先,触摸屏接口有几种转换模式 1. 普通转换模式 单转换模式是最合适的通用ADC转换.此模式可以通过设置ADCCON(A ...

  10. 一个php开发的用于路由器的小功能

    最近接到一个需求,假设有A.B.C 三台主机.现A主机要访问C主机上的一个脚本,并且根据A传递的参数给C主机,同时接受C主机返回来的数据.但是现在A主机不能直接通过url.IP访问C主机,需要借由主机 ...