SPFA 是ford算法的优化版。 这个算法 需要用到一个静态的邻接表,还有一个队列。主要有三部分 一:Aadedge需要把边以静态邻接表的形式保存下来 。
二:inti 初始化 。在初始化的过程中 要把pre【】=== -1,dist【】=== INF。然后输入边的信息。调用Addedge(x , y ,w).。
三:SPFA 这个过程 一开始的时候将start 1 push(1)。通过(j = pre[temp] ;j !=-1 ; j=edge[j].next)将以1为边的所有边 进行遍历 。并且判断是否需要松弛。如果需要那么 将这点加入q的队列中。至到while(!q.empty() 。
二:inti 初始化 。在初始化的过程中 要把pre【】=== -1,dist【】=== INF。然后输入边的信息。调用Addedge(x , y ,w).。
三:SPFA 这个过程 一开始的时候将start 1 push(1)。通过(j = pre[temp] ;j !=-1 ; j=edge[j].next)将以1为边的所有边 进行遍历 。并且判断是否需要松弛。如果需要那么 将这点加入q的队列中。至到while(!q.empty() 。
下面是代码部分
<span style="font-size:18px;">#include
#include
#include
#include
#include
using namespace std ;
#define MAXN 1000
#define INF 1000000
int map[MAXN][MAXN] ;
int visit[MAXN] ;
int pre[MAXN] ;
int dist[MAXN] ;
int path[MAXN] ;
int top ;
queue q ;
struct Edge
{
int to ;
int w ;
int next ;
}edge[MAXN*MAXN];
void addedge(int x ,int y , int w )
{
edge[top].to = y ;
edge[top].w = w ;
edge[top].next = pre[x] ;
pre[x] = top ;
top++ ;
}
void init (int n, int m)
{
int i , j ;
top = 1 ;
memset(pre , -1 ,sizeof(pre)) ;
for(i = 1 ;i <= n ; i++)
dist[i] = INF ;
dist[1] = 0 ;
for(i = 1 ;i <= n ; i++){
for(j = 1 ;j <= n ; j++){
map[i][j] = INF ;
}
}
for(i = 1 ;i <= m ; i++){
int x ,y , w ;
scanf("%d%d%d" ,&x ,&y , &w) ;
if(map[x][y] < w) continue ;
addedge(x,y,w) ;
addedge(y,x,w) ;
map[x][y] = map[y][x] = w ;
}
}
void spfa(int n)
{
int done[MAXN] ;
int temp ;
memset(done , 0 , sizeof(done)) ;
while(!q.empty()) q.pop() ;//第二次用的时候里面已经被上一组的数据盖着
q.push(1) ;
done[1] = 1 ;
path[1] = -1 ;
while(!q.empty()){
temp = q.front() ;
q.pop() ;
done[temp] = 0 ;
int j ;
for(j = pre[temp] ; j != -1 ; j = edge[j].next){
int v ,fee ;
v = edge[j].to ;
fee = edge[j].w ;
if(dist[temp] + fee < dist[v]){
dist[v] = dist[temp] + fee ;
path[v] = temp ;
if(!done[v]){
q.push(v) ;
done[v] = 1 ;
}
}
}
}
}
int main()
{
int m , n ;
int i , j ;
int ans[MAXN] ;
while(scanf("%d%d" ,&n, &m )!=EOF ){
if(n == 0 && m == 0) break ;
init(n ,m) ;
spfa(n) ;
printf("%d\n",dist[n]) ;
int t = 0 ;
for(i = n ; i != -1 ; i = path[i]){
ans[t++] = i ;
}
for(i = t-1 ; i >= 0 ; i--){
printf("%d ",ans[i]) ;
}
printf("\n") ;
}
return 0;
}</span>