SPFA

SPFA与dijkstra算法的区别

1. dijkstra算法是含贪心思想,SPFA更像BFS

2.BFS每个点只入对一次,而SPFA一个点在出了队列之后,可能会重新入队,在本身改进后,用来改进其他点。

3.SPFA可以处理负权边,每个点入队次数超过N,则存在负权环

代码:

View Code
//邻接表存储图的最短路 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
using namespace std;

#define MAXN 100100
struct Edge
{
  int u, next, val;
  Edge() {}
  Edge( int v , int Next ,int Val): u(v),next(Next), val(Val) { }      
}edge[MAXN];

const int inf = 0x7f7f7f7f;
int head[MAXN],dis[MAXN], visit[MAXN], size, S, T, N, M;


struct node
{
  int ID,dis;
};

void init( )
{
  for( int i = 0; i <= N; i++)
  {
       head[i] = -1;
       visit[i] = 0;
       dis[i] = inf;
  }
  size = 0;
       
}

void AddEdge( int u, int v, int val)
{
   edge[size] = Edge( v, head[u], val);
   head[u] = size++;
   
   edge[size] = Edge( u, head[v], val);
   head[v] = size++;
     
}


int SPFA( )
{
   queue<node>q;
   node p;
   p.ID = S;
   p.dis = 0;
   q.push(p);
   dis[S] = 0;
   while( !q.empty( ))
   {  
       p = q.front( );
       q.pop();
       int v = p.ID;
       int wx = dis[v];
       visit[v] = 0;
       for( int e = head[v]; e != -1; e = edge[e].next)
       {  
          int u = edge[e].u;
          int w = edge[e].val;
          if( dis[u] > wx + w )
          {
               dis[u] = wx + w;
               if( !visit[u] )
               {    
                 p.ID = u;
                 p.dis = dis[u];
                 visit[u] = 1;
                 q.push( p );
               }
                
          }  
            
       }
   }
   return dis[T];
} 
        

    
    

int main( )
{
  int a, b, c;
  while( scanf("%d%d", &N, &M), N + M)
  {
     init( );
     for( int i = 1; i <= M; i++)
     {
         scanf("%d%d%d",&a, &b, &c);
         AddEdge(a, b, c);   
     } 
     S = 1;
     T = N;      
     printf("%d\n", SPFA());
  }      
  return 0;  
}

转载于:https://www.cnblogs.com/tangcong/archive/2012/07/10/2584045.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值