首页 > 代码库 > spfa + slf优化
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 id11 {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优化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。