spfa + slf优化
最近在练习费用流 , 不是要用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优化的更多相关文章
- [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- 初识费用流 模板(spfa+slf优化) 餐巾计划问题
今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...
- 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 ...
- SPFA算法(SLF优化)2022.7.8更新
SPFA可能会被卡掉,能用dijkstra就别用SPFA,代码较长,但我已尽力做到解释,请耐心看下去,存储为邻接表存储. #include<bits/stdc++.h> #define i ...
- spfa的SLF优化
spfa的SLF优化就是small label first 优化,当加入一个新点v的时候如果此时的dis[v]比队首dis[q.front()]还要小的话,就把v点加入到队首,否则把他加入到队尾,因为 ...
- 2013成都邀请赛J称号||HDU4725 The Shortest Path in Nya Graph(spfa+slf最短的优化)
职务地址:HDU 4725 这题卡了好长时间了,建图倒是会建,可是不会最短路的算法优化,本以为都须要堆去优化的,打算学了堆之后再来优化.可是昨晚CF的一道题..(那题也是不优化过不了..)然后我就知道 ...
- HDU4725(KB4-P SPFA+LLL+SLF优化)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】
4152: [AMPPZ2014]The Captain Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2107 Solved: 820[Submi ...
- SPFA 小优化*2
/* bzoj 2763 SPFA小优化 循环队列+SLF 顺面改掉自己之前手打qeueu的坏毛病*/ #include<iostream> #include<cstring> ...
随机推荐
- vs2012生成的项目,如何在只装有VS2010的电脑上打开
步骤: 1.用记事本打开Vs2012生成的项目解决方案文件(.sln文件)文件 2.修改前两行 Microsoft Visual Studio Solution File, Format Versio ...
- bzoj 3851: 2048 dp优化
3851: 2048 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 22 Solved: 9[Submit][Status] Description T ...
- uva 12124 - Assemble
最大值最小的题: 直接用二分,比较简单: 不过我的二分老是不用好.有时间总结一下! #include<cstdio> #include<map> #include<vec ...
- nojs iis asp.net mvc
http://blogs.msdn.com/b/scott_hanselman/archive/2011/11/29/window-iis-node-js.aspx http://www.hansel ...
- 单片机 C 语言模块化编程
好的开始是成功的一半 通过上一章的学习,我想你已经掌握了如何在程序中释放CPU了.希望能够继续坚持下去.一个良好的开始是成功的一半.我们今天所做的一切都是为了在单片机编程上做的更好. 在谈论今天的主题 ...
- Android 获取SDCard上图片和视频的缩略图
获取图片缩略图和视频缩略图的方法: Java代码: import java.io.File; import android.app.Activity; import android.graphics. ...
- eclipse或IDEA连接魅蓝
1.首先 安装ADB 驱动 http://developer.android.com/tools/device.html 如果没装就自行去下载安装 别的品牌都可以顺利连接,魅族手机特有的原因导至在开发 ...
- ruby迭代器iterator和枚举器Enumerator
编写自定义的迭代器 The defining feature of an iterator method is that it invokes a block of code associatedwi ...
- while +next 循环 回到循环顶端
my $show_tip = 1; sub login { while (1) { my $api ="https://login.weixin.qq.com/cgi-bin/mmwebwx ...
- 子查询解嵌套not in 无法展开改写
SQL> explain plan for select * from OPS$CZTEST1.SAVJ_ATOMJOURBAK where ((list_flag = '1' and prt_ ...