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

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

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

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <deque>
  6. const int inf = << , maxn = + , M = + ;
  7. using namespace std ;//
  8. int n , m , head[maxn] , dis[maxn] , cnt , sum , tot ;
  9. bool mark[maxn] ;
  10. struct id
  11. {
  12. int nxt ,to , val ;
  13. } edge[M] ;
  14. deque < int > Q ;
  15.  
  16. inline void Init ( )
  17. {
  18. freopen( "NSOOJ#10719.in" , "r" , stdin ) ;
  19. freopen( "NSOOJ#10719.out" , "w" , stdout ) ;
  20. }
  21.  
  22. int read( )
  23. {
  24. char ch = getchar( ) ; int k = , ret = ;
  25. while( ch < '' || ch > '' ) { if( ch == '-' ) k = - ; ch = getchar( ) ; }
  26. while( ch >= '' && ch <= '' ) ret = ret * + ch - '' , ch = getchar( ) ;
  27. return k * ret ;
  28. }
  29.  
  30. void add( int u , int v , int va )
  31. {
  32. edge[++cnt].nxt = head[u] , edge[cnt].to = v ;
  33. edge[cnt].val = va , head[u] = cnt ;
  34. }
  35.  
  36. void input( )
  37. {
  38. n = read() , m = read( ) ;
  39. int u ,v , c ;
  40. memset( head , - , sizeof(head)) ;
  41. for( int x = ; x <= m ; ++x )
  42. {
  43. u = read( ) , v = read( ) , c = read( ) ;
  44. add( u ,v , c ) ;
  45. }
  46. }
  47.  
  48. void spfa( )
  49. {
  50. memset( dis , / , sizeof(dis) ) ;
  51. dis[] = , mark[] = true ;
  52. Q.push_back( ) ;
  53. while( !Q.empty( ) )
  54. {
  55. int u = Q.front( ) ; Q.pop_front( ) ; mark[u] = false ;
  56.  
  57. for( int i = head[u] ; ~i ; i = edge[i].nxt )
  58. {
  59. int v = edge[i].to ;
  60. if( dis[v] > dis[u] + edge[i].val )
  61. {
  62. dis[v] = dis[u] + edge[i].val ;
  63. if( !mark[v] )
  64. {
  65. mark[v] = true ;
  66. if( Q.empty( ) || dis[v] > dis[Q.front( )] ) Q.push_back( v ) ;
  67. else Q.push_front( v ) ;
  68.  
  69. }
  70.  
  71. }
  72. }
  73. }
  74. if( dis[n] == ) printf( "%d\n" , - ) ;
  75. else printf( "%d\n" , dis[n] ) ;
  76. }
  77.  
  78. int main( )
  79. {
  80. // Init( ) ;
  81. input( ) ;
  82. spfa( ) ;
  83. // fclose( stdin ) ;
  84. // fclose( stdout ) ;
  85. return ;
  86. }

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

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <deque>
  6. const int inf = << , maxn = + , M = + ;
  7. using namespace std ;//
  8. int n , m , head[maxn] , dis[maxn] , cnt , sum , tot ;
  9. bool mark[maxn] ;
  10. struct id
  11. {
  12. int nxt ,to , val ;
  13. } edge[M] ;
  14. deque < int > Q ;
  15.  
  16. inline void Init ( )
  17.  
  18. {
  19. freopen( "NSOOJ#10719.in" , "r" , stdin ) ;
  20. freopen( "NSOOJ#10719.out" , "w" , stdout ) ;
  21. }
  22.  
  23. int read( )
  24. {
  25. char ch = getchar( ) ; int k = , ret = ;
  26. while( ch < '' || ch > '' ) { if( ch == '-' ) k = - ; ch = getchar( ) ; }
  27. while( ch >= '' && ch <= '' ) ret = ret * + ch - '' , ch = getchar( ) ;
  28. return k * ret ;
  29. }
  30.  
  31. void add( int u , int v , int va )
  32. {
  33. edge[++cnt].nxt = head[u] , edge[cnt].to = v ;
  34. edge[cnt].val = va , head[u] = cnt ;
  35. }
  36.  
  37. void input( )
  38. {
  39. n = read() , m = read( ) ;
  40. int u ,v , c ;
  41. memset( head , - , sizeof(head)) ;
  42. for( int x = ; x <= m ; ++x )
  43. {
  44. u = read( ) , v = read( ) , c = read( ) ;
  45. add( u ,v , c ) ;
  46. }
  47. }
  48.  
  49. void spfa( )
  50. {
  51. memset( dis , / , sizeof(dis) ) ;
  52. dis[] = , mark[] = true ;
  53. Q.push_back( ) ; tot = ;
  54. while( !Q.empty( ) )
  55. {
  56. int u = Q.front( ) ; Q.pop_front( ) ; mark[u] = false ;
  57. tot-- ; sum -= dis[u] ;
  58. for( int i = head[u] ; ~i ; i = edge[i].nxt )
  59. {
  60. int v = edge[i].to ;
  61. if( dis[v] > dis[u] + edge[i].val )
  62. {
  63. dis[v] = dis[u] + edge[i].val ;
  64. if( !mark[v] )
  65. {
  66. mark[v] = true ;
  67. if( Q.empty( ) || dis[v] * tot <= sum ) Q.push_back( v ) ;
  68. else Q.push_front( v ) ;
  69. tot++ ; sum += dis[v] ;
  70. }
  71.  
  72. }
  73. }
  74. }
  75. if( dis[n] == ) printf( "%d\n" , - ) ;
  76. else printf( "%d\n" , dis[n] ) ;
  77. }
  78.  
  79. int main( )
  80. {
  81. // Init( ) ;
  82. input( ) ;
  83. spfa( ) ;
  84. // fclose( stdin ) ;
  85. // fclose( stdout ) ;
  86. return ;
  87. }

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

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <deque>
  6. const int inf = << , maxn = + , M = + ;
  7. using namespace std ;//
  8. int n , m , head[maxn] , dis[maxn] , cnt , sum , tot ;
  9. bool mark[maxn] ;
  10. struct id
  11. {
  12. int nxt ,to , val ;
  13. } edge[M] ;
  14. deque < int > Q ;
  15.  
  16. inline void Init ( )
  17. {
  18. freopen( "NSOOJ#10719.in" , "r" , stdin ) ;
  19. freopen( "NSOOJ#10719.out" , "w" , stdout ) ;
  20. }
  21.  
  22. int read( )
  23. {
  24. char ch = getchar( ) ; int k = , ret = ;
  25. while( ch < '' || ch > '' ) { if( ch == '-' ) k = - ; ch = getchar( ) ; }
  26. while( ch >= '' && ch <= '' ) ret = ret * + ch - '' , ch = getchar( ) ;
  27. return k * ret ;
  28. }
  29.  
  30. void add( int u , int v , int va )
  31. {
  32. edge[++cnt].nxt = head[u] , edge[cnt].to = v ;
  33. edge[cnt].val = va , head[u] = cnt ;
  34. }
  35.  
  36. void input( )
  37. {
  38. n = read() , m = read( ) ;
  39. int u ,v , c ;
  40. memset( head , - , sizeof(head)) ;
  41. for( int x = ; x <= m ; ++x )
  42. {
  43. u = read( ) , v = read( ) , c = read( ) ;
  44. add( u ,v , c ) ;
  45. }
  46. }
  47.  
  48. void spfa( )
  49. {
  50. memset( dis , / , sizeof(dis) ) ;
  51. dis[] = , mark[] = true ;
  52. Q.push_back( ) ; tot = ;
  53. while( !Q.empty( ) )
  54. {
  55. int u = Q.front( ) ; Q.pop_front( ) ; mark[u] = false ;
  56. tot-- ; sum -= dis[u] ;
  57. for( int i = head[u] ; ~i ; i = edge[i].nxt )
  58. {
  59. int v = edge[i].to ;
  60. if( dis[v] > dis[u] + edge[i].val )
  61. {
  62. dis[v] = dis[u] + edge[i].val ;
  63. if( !mark[v] )
  64. {
  65. mark[v] = true ;
  66. if( Q.empty( ) || dis[v] > dis[Q.front( )] || dis[v] * tot <= sum ) Q.push_back( v ) ;
  67. else Q.push_front( v ) ;
  68. tot++ ; sum += dis[v] ;
  69. }
  70.  
  71. }
  72. }
  73. }
  74. if( dis[n] == ) printf( "%d\n" , - ) ;
  75. else printf( "%d\n" , dis[n] ) ;
  76. }
  77.  
  78. int main( )
  79. {
  80. // Init( ) ;
  81. input( ) ;
  82. spfa( ) ;
  83. // fclose( stdin ) ;
  84. // fclose( stdout ) ;
  85. return ;
  86. }

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. MySQL - “Timeout error occurred trying to start MySQL Daemon”解决方法

    前几天,网站出现Many connections的问题,进入mysql,show full processlist发现有154个进程,晕....直接service mysqld restart 但是不 ...

  2. [转]Python中的矩阵转置

    Python中的矩阵转置 via 需求: 你需要转置一个二维数组,将行列互换. 讨论: 你需要确保该数组的行列数都是相同的.比如: arr = [[1, 2, 3], [4, 5, 6], [7, 8 ...

  3. insert遭遇阻塞

    insert的阻塞确实不常见,今天碰到了一个,看书又了解一个,整理下.1.多个会话同时向unique字段插入相同的值session1:首先建测试表test,并在字段id上创建一个主键索引(唯一键也可以 ...

  4. qt 5 基础知识 2(控件篇)

    QVBoxLayout *lay = new QVBoxLayout(this); // 创建一个竖直的盒子 lebel 篇 lay->addWidget(label = new QLabel( ...

  5. iOS Copy 和 MutableCopy的区别 深浅拷贝的区别-供参考

    概述 对于系统的非容器类对象,对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝).如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的. 对于 ...

  6. 简谈Comparable和Comparator区别

    对于Comparable和Comparator这连个相似的接口,还是做一下比较比较好: Comparable Comparator (1)只包含一个compareTo()方法,此方法可以给两个对象排序 ...

  7. 3.2.3 使用Parameters动态生成where语句_JasperReports iRepor

    $P!{ParametersName}格式的SQL语句 来源:http://book.2cto.com/201306/24311.html#12732-hi-1-66926-020ef5b321fac ...

  8. DZ真是各种强大

    近期对论坛做了大装修,非常享受这个过程. 真是着迷了,这个装修工程让我接连几天几乎到了废寝忘食的地步. 终于告一段落,又想起来折腾,因为对之前的文库系统感觉种种别扭. 没有空调,没有风扇,居然忙到夜里 ...

  9. SharePoint 2010 母版页制作的简单介绍

    转:http://www.cnblogs.com/jianyus/archive/2012/01/11/2319621.html 1.  首先打开SharePoint Designer 2010,找到 ...

  10. [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现

    转自:http://www.cnblogs.com/zhili/archive/2012/09/03/2666974.html 上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享 ...