spfa + slf优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spfa + slf优化相关的知识,希望对你有一定的参考价值。

最近在练习费用流 , 不是要用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 = 1 << 30 , maxn = 100000 + 11 , M = 200000 + 11  ; 
 7 using namespace std ;//1061109567
 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 
17 inline void Init ( )
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 = 1 , ret = 0 ;
26     while( ch < 0 || ch > 9 ) { if( ch == - ) k = -1 ; ch = getchar( ) ; }
27     while( ch >= 0 && ch <= 9 ) ret = ret * 10 + ch - 0 , 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 , -1 , sizeof(head)) ;
42     for( int x = 1 ; 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 , 127/2 , sizeof(dis) ) ;
52     dis[1] = 0 , mark[1] = true ;
53     Q.push_back( 1 ) ;
54     while( !Q.empty( ) )
55     {
56         int u = Q.front( ) ; Q.pop_front( ) ; mark[u] = false ;
57     
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] > dis[Q.front( )]  ) Q.push_back( v ) ;
68                     else Q.push_front( v ) ;
69                     
70                 }
71             
72             }
73         }
74     }
75     if( dis[n] == 1061109567 ) printf( "%d\n" , -1 ) ;
76     else printf( "%d\n" , dis[n] ) ;
77 }
78 
79 
80 int main( )
81 {
82 //    Init( ) ; 
83     input( ) ;
84     spfa( ) ;
85 //    fclose( stdin ) ;
86 //       fclose( stdout ) ;
87     return 0 ;
88 }

 

以上是关于spfa + slf优化的主要内容,如果未能解决你的问题,请参考以下文章

spfa + slf优化

spfa slf优化

SPFA+SLF+LLL优化模板

[图论]最短路(包括SLF优化spfa的原理)

SPFA算法的SLF优化 ——loj#10081. 「一本通 3.2 练习 7」道路和航线

SPFA的两种优化