SPFA算法求解最短路径(改进Bellman-ford)

//spfa算法步骤:https://blog.csdn.net/hehehaha1123/article/details/63250235
import java.util.*;
public class SPFA {
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int Vnum=in.nextInt();
            int Enum=in.nextInt();
            Edge e[]=new Edge[Enum];
            int start=in.nextInt();
            for(int i=0;i<Enum;i++){
                int flag1=1;
                int x=in.nextInt();
                int y=in.nextInt();
                int value=in.nextInt();
                e[i]=new Edge(x,y,value);
            }
            int pre[]=new int[Vnum];
            for(int i=0;i<Vnum;i++)
                pre[i]=start;
            int dist[]=new int[Vnum];
            for(int i=0;i<Vnum;i++){
                dist[i]=Integer.MAX_VALUE;
            }
            //打印结果
            dist[start]=0;
            if(f_spfa(start,pre,dist,Vnum,e)){
                for(int i=0;i<Vnum;i++){
                    if(i!=start) {
                        Print_path(start,i,pre);
                        System.out.println(dist[i]);
                    }
                }
            }
        }
    }
    //spfa算法主要步骤
    public static boolean f_spfa(int start,int pre[],int dist[],int Vnum,Edge e[]){
        Queue<Integer> queue=new LinkedList<Integer>();
        queue.add(start);
        int used[]=new int[Vnum];//记录当前是否在队列中
        int cnt[]=new int[Vnum]; //记录使用次数
        used[start]=1;
        cnt[start]++;
        while(queue.size()>0){
            int pos=queue.poll();
            for(int i=0;i<e.length;i++){
                if(pos==e[i].x && dist[e[i].x]!=Integer.MAX_VALUE){
                    if(dist[e[i].x]+e[i].value<dist[e[i].y]){
                        pre[e[i].y]=e[i].x;
                        dist[e[i].y]=dist[e[i].x]+e[i].value;
                        if(used[e[i].y]==0){
                            queue.add(e[i].y); //入队列策略
                            used[e[i].y]=1;
                            cnt[e[i].y]++;
                            //判断是否有环
                            if(cnt[e[i].y]>Vnum){
                                return false;
                            }
                        }
                    }
                }
            }
            used[pos]=0;
        }
        return true;
    }
    //打印路径
    public static void Print_path(int start,int end,int pre[]){
        Stack<Integer> ans=new Stack<Integer>();
        ans.add(end);
        while(end!=pre[end]){
            end=pre[end];
            ans.add(end);
        }
        int flag1=1;
        while(ans.size()>0) {
            if (flag1 == 1) {
                System.out.print(ans.pop());
                flag1 = 0;
            } else {
                System.out.print("->" + ans.pop());
            }
        }
        System.out.print("=");
    }
}
//定义数据结构
class Edge{
    int x;
    int y;
    int value;
    Edge(int x,int y,int value){
        this.x=x;
        this.y=y;
        this.value=value;
    }
    public void setValue(int value){
        this.value=value;
    }
}
    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/anhuibozhoushatu/article/details/83796658
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞