spfa经过deque(双向队列)优化后的模板

                        spfa经过deque(双向队列)优化后的模板

//
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include < string.h> 
#include <ctype.h> 
#include <time.h> 
// C++ 
#include <iostream> 
#include <algorithm> 
#include <queue> 
#include <vector> 
#include <map> 
#include <list> 
using  namespace std; 
 
// start 
//
typedef  long  long LL; 
// typedef __int64 LL;
#define INF 0x7F7F7F7F 
#define HEAD 100 
#define EDGE 10000 
#define eps 1e-8 
 
typedef pair < int ,  int> PII;
#define MP make_pair
 
#define CLEAR(a,b) memset ( a , b , sizeof ( a ) ) 
#define CLEARN(a,b,s,size) memset ( a + s , b , sizeof size ) 
 
#define FOR(a,b,i) for ( i = a ; i < b ; i++ ) 
#define FORB(b,a,i) for ( i = b ; i > a ; i-- ) 
#define FORE(a,b,i) for ( i = a ; i <= b ; i++ ) 
#define FOREB(b,a,i) for ( i = b ; i >= a ; i-- ) 
#define FORN(a,b,i,nc) for ( i = a ; i < b ; i += nc ) 
#define FORNB(b,a,i,nc) for ( i = b ; i > a ; i -= nc ) 
#define FOREN(a,b,i,nc) for ( i = a ; i <= b ; i += nc ) 
#define FORENB(b,a,i,nc) for ( i = b ; i >= a ; i -= nc ) 
 
#define COPY(a,b,lt,rt,i) for ( i = lt ; i <= rt ; i++ ) a[i] = b[i]; 
 
#define sqr(a,b) sqrt ( (double) a * a + (double) b * b ) 
 
// c++ 
template < class T> inline T INT_LEN( T v ) {  int len =  1 ;  while ( v /=  10 ) ++len;  return len; } 
 
// #define LocalHost 
 
int M = EDGE;
 
bool vis[HEAD];
 
int dis[HEAD] , q[EDGE];
 
int N;
 
void spfa (  int * head , re * edge ,  int s ,  int M ){    //  re 为a边À?的Ì?类¤¨¤型¨ª
     int i , u , v , front =  0 , rear =  1 ; 
    CLEAR ( vis ,  0 ); 
    CLEAR ( dis ,  0x7f );
    dis[s] =  0
    q[ 0] = s; 
     while ( front != rear ){ 
        u = q[front++] ; 
         if ( front == M ) front =  0
        vis[u] =  false
         for ( i = head[u] ; ~i ; i = edge[i].nxt ){ 
            v = edge[i].v; 
             if ( dis[v] > dis[u] + edge[i].w ){ 
                dis[v] = dis[u] + edge[i].w ; 
                 if ( !vis[v] ){ 
                    vis[v] =  true;
                     if ( dis[v] > dis[q[front]] ){
                        q[rear++] = v; 
                         if ( rear == M ) rear =  0
                    }
                     else {
                         if ( --front <  0 ) front = ~-M;
                        q[front] = v;
                    }
                } 
            } 
        } 
    } 
 转载自: http://blog.sina.com.cn/s/blog_64018c250100xbaz.html

转载于:https://www.cnblogs.com/g0feng/archive/2012/05/15/2502288.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值