//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;
}
}
SPFA算法求解最短路径(改进Bellman-ford)
原文作者:Bellman - ford算法
原文地址: https://blog.csdn.net/anhuibozhoushatu/article/details/83796658
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/anhuibozhoushatu/article/details/83796658
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。