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 - “Timeout error occurred trying to start MySQL Daemon”解决方法
前几天,网站出现Many connections的问题,进入mysql,show full processlist发现有154个进程,晕....直接service mysqld restart 但是不 ...
- [转]Python中的矩阵转置
Python中的矩阵转置 via 需求: 你需要转置一个二维数组,将行列互换. 讨论: 你需要确保该数组的行列数都是相同的.比如: arr = [[1, 2, 3], [4, 5, 6], [7, 8 ...
- insert遭遇阻塞
insert的阻塞确实不常见,今天碰到了一个,看书又了解一个,整理下.1.多个会话同时向unique字段插入相同的值session1:首先建测试表test,并在字段id上创建一个主键索引(唯一键也可以 ...
- qt 5 基础知识 2(控件篇)
QVBoxLayout *lay = new QVBoxLayout(this); // 创建一个竖直的盒子 lebel 篇 lay->addWidget(label = new QLabel( ...
- iOS Copy 和 MutableCopy的区别 深浅拷贝的区别-供参考
概述 对于系统的非容器类对象,对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝).如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的. 对于 ...
- 简谈Comparable和Comparator区别
对于Comparable和Comparator这连个相似的接口,还是做一下比较比较好: Comparable Comparator (1)只包含一个compareTo()方法,此方法可以给两个对象排序 ...
- 3.2.3 使用Parameters动态生成where语句_JasperReports iRepor
$P!{ParametersName}格式的SQL语句 来源:http://book.2cto.com/201306/24311.html#12732-hi-1-66926-020ef5b321fac ...
- DZ真是各种强大
近期对论坛做了大装修,非常享受这个过程. 真是着迷了,这个装修工程让我接连几天几乎到了废寝忘食的地步. 终于告一段落,又想起来折腾,因为对之前的文库系统感觉种种别扭. 没有空调,没有风扇,居然忙到夜里 ...
- SharePoint 2010 母版页制作的简单介绍
转:http://www.cnblogs.com/jianyus/archive/2012/01/11/2319621.html 1. 首先打开SharePoint Designer 2010,找到 ...
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
转自:http://www.cnblogs.com/zhili/archive/2012/09/03/2666974.html 上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享 ...