关于spfa

知识点

原始版 ---裸

应用:

一、判负环

两种方法

1.跑单源点bfs,如果某一个点入队了n-1次,存在

2.对于每个点dfs,如果此源点反被其他点更新,存在

证明:点i作为源点,d[i]==0 若i被更新,d[i]<0 定存在负环

优化:若初始d[]={0} 则最开始一定先跑权为负的边,更容易找到负环

int d[N]={0};fg=1;
for(int i=1;i<=n;i++){dfs(i);if(!fg)break;}
void dfs(int u){
if(!fg)return;
vis[u]=1;
for(int i=hd[u];i;i=e[i].next){
int v=e[i].v;
if(d[v]>d[u]+e[i].w){
if(vis[v]){fg=0;return;}
d[v]=d[u]+e[i].w;
dfs(v);
}
}
vis[u]=0;
}

  

二、网络流最小费用最大流

无限spfa直到没有可流的量

在原始spfa中,加入流量限制 ,记录入边

每次spfa结束后沿入边更新流量即可

queue<int>q;
bool spfa(int s,int t,int &flow,int &cost){
for(int i=1;i<=t;i++)d[i]=inf;
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
q.push(s);vis[s]=1;a[s]=inf;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(e[i].cap>e[i].flow&&d[v]>d[u]+e[i].w){
d[v]=d[u]+e[i].w;
pre[v]=i;
a[v]=min(e[i].cap-e[i].flow,a[u]);
if(!vis[v]){
q.push(v);
vis[v]=1;
} }
}
}
if(d[t]==inf)return 0;
flow+=a[t];cost+=d[t]*a[t];
int u=t;
while(u!=s){
e[pre[u]].flow+=a[t];
e[pre[u]^1].flow-=a[t];
u=e[pre[u]].u;
}
return 1;
}
int flow=0,cost=0;
while(spfa(0,n+1,flow,cost));

  

三、差分约束

建图更复杂,建好图就很水了

优化:

SLF

双向队列优化  若d[v]<d[head] 插入队首 否则队尾

堆优化:手写小顶堆或者STL优先队列

优点

跑稀疏图较快且可以跑负边权

复杂度 O(E*K)  K为常数且大致为1~2

题目分析:

Spfa其实很简单啊,只是建模比较麻烦了

1.首先今上午的考试题,spfa中加一个dp,存到现在点用了几个血包,但由于恶心的出题人卡了你一下,你需要一个SLF优化或者转成dijkstra

知识点:dp+优化

2.某个题目吧,大致是一个n*m的方格图,只能沿着边走,问从一个坐标到另一个坐标最少需要转几次弯。  拆点,每个格点拆为上下左右四个点,表示向哪个方向走,想到拆点之后建边就很简单了

知识点:拆点

3.一道很裸的判负环的题,方法上面又讲,代码也很简单

知识点:判负环

4.分层spfa,有一些层次,每个层次只能向下一层次建边

知识点:建模

大概见过的题目好像就只有这些了。。。

考得多的其实是拆点和建边吧

 

 

(完)

SPFA小总结的更多相关文章

  1. SPFA 小优化*2

    /* bzoj 2763 SPFA小优化 循环队列+SLF 顺面改掉自己之前手打qeueu的坏毛病*/ #include<iostream> #include<cstring> ...

  2. 小K的农场(差分约束,spfa)

    题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...

  3. 【最短路】【spfa】小vijos P1447 Updown

    小vijos P1447 Updown 背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大 ...

  4. 2018年长沙理工大学第十三届程序设计竞赛 E小木乃伊到我家(spfa模版)

    链接:https://www.nowcoder.com/acm/contest/96/E来源:牛客网 小木乃伊到我家 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

  5. 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...

  6. Spfa【P1813】拯救小tim_NOI导刊2011提高(02)

    Description 小tim在游乐场,有一天终于逃了出来!但是不小心又被游乐场的工作人员发现了„„所以你的任务是安全地把小tim护送回家.但是,A市复杂的交通状况给你出了一大难题. A市一共有n个 ...

  7. SPFA的小优化

    标签:闲扯 SPFA的小优化 1. 向队尾加入元素时,如果它比对首还优,就把把它直接和队首交换. 拿一个双端队列来实现 (手写 , head ,tail   STLdeque亲测及其慢) 这个小优化其 ...

  8. HihoCoder - 1093 小Hi和小Ho (SPFA)

    描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两 ...

  9. 几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim

    1.topology: #include <fstream> #include <iostream> #include <algorithm> #include & ...

随机推荐

  1. [知识梳理]课本1&2.1-2.5

    面向对象的语言 出发点:更直接地描述客观世界中存在的事物(对象)以及它们之间的关系. 特点: 是高级语言. 将客观事物看作具有属性和行为的对象. 通过抽象找出同一类对象的共同属性和行为,形成类. 通过 ...

  2. Java 持久化操作之 --io流与序列化

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  3. ArrayList源码学习----JDK1.7

    什么是ArrayList? ArrayList是存储一组数据的集合,底层也是基于数组的方式实现,实际上也是对数组元素的增删改查:它的主要特点是: 有序:(基于数组实现) 随机访问速度快:(进行随机访问 ...

  4. Jenkins中展示HTML测试报告

    背景:测试报告是用reportNG生成的,属于java自动化测试项目. 1)         安装插件 首先要安装HTML Publisher plugin,这个在插件管理里面搜索并安装即可,如下我已 ...

  5. Spring中报"Could not resolve placeholder"的解决方案

    除去properites文件路径错误.拼写错误外,出现"Could not resolve placeholder"很有可能是使用了多个PropertyPlaceholderCon ...

  6. C#制作ActiveX插件

    首先新建项目--->类库,取名:ActiveXDemo 右键项目属性:应用属性==>程序集信息=>使程序集Com可见, 生成==>输出==>为com互操作注册 新建接口类 ...

  7. spring8——AOP之Bean的自动代理生成器

    对于上篇博客http://www.cnblogs.com/cdf-opensource-007/p/6464237.html结尾处提到的两个问题,可以使用spring提供的自动代理生成器解决.自动代理 ...

  8. IIFE的形式、原理和常见写法

    immediately invoked function expression 立即调用的函数表达式 出现的形式: 最近做牛客网的JS在线编程,遇到几道考闭包的题目,发现闭包的尾巴那儿经常会出现一对小 ...

  9. Python之编码

    一.Python2与Python3的区别 1.从宏观上考虑,Python2重复代码太多,错误率高,不够规范.Python崇尚的是语言简洁.优美.清晰.Python3更加规范,重复代码少: 2.Pyth ...

  10. 2017年Unity游戏开发视频教程(入门到精通)

    本文是我发布的一个Unity游戏开发的学习目录,以后我会持续发布一系列的游戏开发教程,都会更新在这个页面上,适合人群有下面的几种: 想要做独立游戏的人 想要找游戏开发相关工作的人 对游戏开发感兴趣的人 ...