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> ...
随机推荐
- mysql自动备份数据库
可以选择设置需要备份的库,自动备份压缩,自动删除 7 天前的备份,需要使用 crontab 定时执行. #!/bin/bash # 要备份的数据库名,多个数据库用空格分开 databases=(db1 ...
- 禁止选择文本和禁用右键 v3.0
禁止选中字体(注:在火狐浏览器没有起到效果作用) <script> function disableselect(e) { var omitformtags = ["input& ...
- python【第十九篇】Django进阶
1.路由系统优化 1.1 路由分发 前面我们已经知道,在工程名下的urls.py中写我们的路由映射关系,那么问题来了,假设我们有10个app,如果把所有的url映射都写在urls.py文件中,那么每一 ...
- C#中的委托事件的分析
推荐:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 委托和事件在 .NET Framework 中的应用非常广泛,然而, ...
- 关于Java(介绍)
基于Java官方指导文档,开展学习 Java是什么 Java 是编程语言,也是一个平台 特性 简单 可移植 面向对象 分布式运算高性能 健壮 安全 动态 体系结构中立 记忆宫殿:恋爱是件简单的事,但放 ...
- Web应用的组件化(二)
管控平台 在上一篇中我们提到了组件化的大致思路,这一篇主要讲述在这么做之后,我们需要哪些外围手段去管控整个开发过程.从各种角度看,面对较大规模前端开发团队,都有必要建立这么一个开发阶段的协作平台. 在 ...
- 配置PhpStorm调试PHP
配置PhpStorm调试PHP 第一步:配置 XDebug 下载安装XDebug到本地环境(参考:Zend Studio 9.x + xampp + XDebug 调试环境安装详解),打开php.in ...
- OneAlert 入门(三)——事件分析
OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.有了 OneAlert,你可以更快更合理地为事件划分 ...
- Number Sequence ----HDOJ 1711
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU-1253 胜利大逃亡 (BFS)
此题可以做为三维深搜模板题.. 胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...