最近在练习费用流 , 不是要用spfa吗 ,我们教练说:ns学生写朴素的spfa说出去都让人笑 。

QwQ,所以就去学了一下优化 。

slf优化就是双向队列优化一下,本来想用lll优化,可是优化后我tm居然t了(那道题特地卡spfa),所以lll优化太迷了 ,还是只用slf优化好 。

 #include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <deque>
const int inf = << , maxn = + , M = + ;
using namespace std ;//
int n , m , head[maxn] , dis[maxn] , cnt , sum , tot ;
bool mark[maxn] ;
struct id
{
int nxt ,to , val ;
} edge[M] ;
deque < int > Q ; inline void Init ( )
{
freopen( "NSOOJ#10719.in" , "r" , stdin ) ;
freopen( "NSOOJ#10719.out" , "w" , stdout ) ;
} int read( )
{
char ch = getchar( ) ; int k = , ret = ;
while( ch < '' || ch > '' ) { if( ch == '-' ) k = - ; ch = getchar( ) ; }
while( ch >= '' && ch <= '' ) ret = ret * + ch - '' , ch = getchar( ) ;
return k * ret ;
} void add( int u , int v , int va )
{
edge[++cnt].nxt = head[u] , edge[cnt].to = v ;
edge[cnt].val = va , head[u] = cnt ;
} void input( )
{
n = read() , m = read( ) ;
int u ,v , c ;
memset( head , - , sizeof(head)) ;
for( int x = ; x <= m ; ++x )
{
u = read( ) , v = read( ) , c = read( ) ;
add( u ,v , c ) ;
}
} void spfa( )
{
memset( dis , / , sizeof(dis) ) ;
dis[] = , mark[] = true ;
Q.push_back( ) ;
while( !Q.empty( ) )
{
int u = Q.front( ) ; Q.pop_front( ) ; mark[u] = false ; for( int i = head[u] ; ~i ; i = edge[i].nxt )
{
int v = edge[i].to ;
if( dis[v] > dis[u] + edge[i].val )
{
dis[v] = dis[u] + edge[i].val ;
if( !mark[v] )
{
mark[v] = true ;
if( Q.empty( ) || dis[v] > dis[Q.front( )] ) Q.push_back( v ) ;
else Q.push_front( v ) ; } }
}
}
if( dis[n] == ) printf( "%d\n" , - ) ;
else printf( "%d\n" , dis[n] ) ;
} int main( )
{
// Init( ) ;
input( ) ;
spfa( ) ;
// fclose( stdin ) ;
// fclose( stdout ) ;
return ;
}

纠正,其实lll优化一般效率还是挺高的,只是学长说如果要卡的话可以卡到指数级(=_=),所以下面是lll优化的代码 。

 #include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <deque>
const int inf = << , maxn = + , M = + ;
using namespace std ;//
int n , m , head[maxn] , dis[maxn] , cnt , sum , tot ;
bool mark[maxn] ;
struct id
{
int nxt ,to , val ;
} edge[M] ;
deque < int > Q ; inline void Init ( ) {
freopen( "NSOOJ#10719.in" , "r" , stdin ) ;
freopen( "NSOOJ#10719.out" , "w" , stdout ) ;
} int read( )
{
char ch = getchar( ) ; int k = , ret = ;
while( ch < '' || ch > '' ) { if( ch == '-' ) k = - ; ch = getchar( ) ; }
while( ch >= '' && ch <= '' ) ret = ret * + ch - '' , ch = getchar( ) ;
return k * ret ;
} void add( int u , int v , int va )
{
edge[++cnt].nxt = head[u] , edge[cnt].to = v ;
edge[cnt].val = va , head[u] = cnt ;
} void input( )
{
n = read() , m = read( ) ;
int u ,v , c ;
memset( head , - , sizeof(head)) ;
for( int x = ; x <= m ; ++x )
{
u = read( ) , v = read( ) , c = read( ) ;
add( u ,v , c ) ;
}
} void spfa( )
{
memset( dis , / , sizeof(dis) ) ;
dis[] = , mark[] = true ;
Q.push_back( ) ; tot = ;
while( !Q.empty( ) )
{
int u = Q.front( ) ; Q.pop_front( ) ; mark[u] = false ;
tot-- ; sum -= dis[u] ;
for( int i = head[u] ; ~i ; i = edge[i].nxt )
{
int v = edge[i].to ;
if( dis[v] > dis[u] + edge[i].val )
{
dis[v] = dis[u] + edge[i].val ;
if( !mark[v] )
{
mark[v] = true ;
if( Q.empty( ) || dis[v] * tot <= sum ) Q.push_back( v ) ;
else Q.push_front( v ) ;
tot++ ; sum += dis[v] ;
} }
}
}
if( dis[n] == ) printf( "%d\n" , - ) ;
else printf( "%d\n" , dis[n] ) ;
} int main( )
{
// Init( ) ;
input( ) ;
spfa( ) ;
// fclose( stdin ) ;
// fclose( stdout ) ;
return ;
}

好的,下面是两个都加的代码 。

 #include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <deque>
const int inf = << , maxn = + , M = + ;
using namespace std ;//
int n , m , head[maxn] , dis[maxn] , cnt , sum , tot ;
bool mark[maxn] ;
struct id
{
int nxt ,to , val ;
} edge[M] ;
deque < int > Q ; inline void Init ( )
{
freopen( "NSOOJ#10719.in" , "r" , stdin ) ;
freopen( "NSOOJ#10719.out" , "w" , stdout ) ;
} int read( )
{
char ch = getchar( ) ; int k = , ret = ;
while( ch < '' || ch > '' ) { if( ch == '-' ) k = - ; ch = getchar( ) ; }
while( ch >= '' && ch <= '' ) ret = ret * + ch - '' , ch = getchar( ) ;
return k * ret ;
} void add( int u , int v , int va )
{
edge[++cnt].nxt = head[u] , edge[cnt].to = v ;
edge[cnt].val = va , head[u] = cnt ;
} void input( )
{
n = read() , m = read( ) ;
int u ,v , c ;
memset( head , - , sizeof(head)) ;
for( int x = ; x <= m ; ++x )
{
u = read( ) , v = read( ) , c = read( ) ;
add( u ,v , c ) ;
}
} void spfa( )
{
memset( dis , / , sizeof(dis) ) ;
dis[] = , mark[] = true ;
Q.push_back( ) ; tot = ;
while( !Q.empty( ) )
{
int u = Q.front( ) ; Q.pop_front( ) ; mark[u] = false ;
tot-- ; sum -= dis[u] ;
for( int i = head[u] ; ~i ; i = edge[i].nxt )
{
int v = edge[i].to ;
if( dis[v] > dis[u] + edge[i].val )
{
dis[v] = dis[u] + edge[i].val ;
if( !mark[v] )
{
mark[v] = true ;
if( Q.empty( ) || dis[v] > dis[Q.front( )] || dis[v] * tot <= sum ) Q.push_back( v ) ;
else Q.push_front( v ) ;
tot++ ; sum += dis[v] ;
} }
}
}
if( dis[n] == ) printf( "%d\n" , - ) ;
else printf( "%d\n" , dis[n] ) ;
} int main( )
{
// Init( ) ;
input( ) ;
spfa( ) ;
// fclose( stdin ) ;
// fclose( stdout ) ;
return ;
}

spfa + slf优化的更多相关文章

  1. [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  2. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

  3. POJ - 3268 Silver Cow Party SPFA+SLF优化 单源起点终点最短路

    Silver Cow Party One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to ...

  4. SPFA算法(SLF优化)2022.7.8更新

    SPFA可能会被卡掉,能用dijkstra就别用SPFA,代码较长,但我已尽力做到解释,请耐心看下去,存储为邻接表存储. #include<bits/stdc++.h> #define i ...

  5. spfa的SLF优化

    spfa的SLF优化就是small label first 优化,当加入一个新点v的时候如果此时的dis[v]比队首dis[q.front()]还要小的话,就把v点加入到队首,否则把他加入到队尾,因为 ...

  6. 2013成都邀请赛J称号||HDU4725 The Shortest Path in Nya Graph(spfa+slf最短的优化)

    职务地址:HDU 4725 这题卡了好长时间了,建图倒是会建,可是不会最短路的算法优化,本以为都须要堆去优化的,打算学了堆之后再来优化.可是昨晚CF的一道题..(那题也是不优化过不了..)然后我就知道 ...

  7. HDU4725(KB4-P SPFA+LLL+SLF优化)

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  8. 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】

    4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2107  Solved: 820[Submi ...

  9. SPFA 小优化*2

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

随机推荐

  1. Eyeshot Ultimate 学习笔记(2)

    导入模型 一般情况下,我们自己搭建模型的功力还不够,大多都是在3Dmax中做好模型,导出成模型文件,然后再导入Eyeshot视图中.导入的代码包括: OpenFileDialog openFileDi ...

  2. js 数组 var arr=[] 的用法总结

    刚接触了一个js数组,用起来很头疼,总结一下 基本格式: var arr = [[name,value],[name2,value2],[name3,value3]]; 如何给 arr 动态添加元素 ...

  3. Omnithreadlibary学习(3)-IOmniTask异步执行SendMessage

    在任务中发送消息, 可以是函数或者对象方法 TOmniTaskMessageEvent = procedure(const task: IOmniTaskControl; const msg: TOm ...

  4. 数位DP入门之hdu 3652 B-number

    hdu 3652 B-number Problem Description A wqb-number, or B-number for short, is a non-negative integer ...

  5. iOS之手势滑动返回功能-b

    iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的 ...

  6. c/c++多级指针

    c/c++多级指针 如图: # include <stdio.h> int main(void) { ; int * p = &i; //p只能存放int类型变量的地址 int * ...

  7. Discuz! 7.2 SQL注入exp

    已经有人写出一些工具了,但是感觉不怎么好用,就自己写了个. 参数:1.可直接getshell2.爆管理账号密码3.爆表前缀如果表前缀不是默认的cdb_ 只需更改代码中的 $table即可,方便快捷. ...

  8. 移动应用产品开发-android开发(二)

    这段时间实在太忙了,也没什么精力来写博客,还是没养成写博客的习惯,还是得记载下来,不然时间久了就忘记了. 早上一大早就来公司了,趁还早,拟定今天的工作内容和计划后,赶紧记载点东西. 最近做androi ...

  9. 【网络流24题】No.19 负载平衡问题 (费用流)

    [题意] G 公司有 n 个沿铁路运输线环形排列的仓库, 每个仓库存储的货物数量不等. 如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入文件示例input ...

  10. Android用户界面 UI组件--自动提示输入框 AutoCompleteTextView和MultiAutoCompleteTextView

    AutoCompleteTextView: 就是一个带自动提示的EditText,当输入字符时,会出现提示. android:completionThreshold  输入几个字符时提示 androi ...