解决负权边的算法
直接上代码
package 啊哈;
import java.util.Arrays;
import java.util.Scanner;
public class Bellman_ford解决负权边 {
static int[] u=new int[10];//起点
static int[] v=new int[10];//终点
static int[] w=new int[10];//权值
static int[] dis=new int[10];//单源最短路径数组
static int n,m;
static int inf=99999999;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
Arrays.fill(u,0);
Arrays.fill(v,0);
Arrays.fill(w,0);
Arrays.fill(dis,0);
for(int i=1;i<=m;i++){
u[i]=sc.nextInt();
v[i]=sc.nextInt();
w[i]=sc.nextInt();
}
for(int i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;//初始化
//核心代码
for(int k=1;k<=n-1;k++) //源点本身不用更新,更新n-1轮,更新n-1个点
for(int i=1;i<=m;i++)遍历所有的边更新dis
if(dis[v[i]]>dis[u[i]]+w[i])//比较源点到终点 与 源点到起点再到终点,其实就是松弛,和Floyd,Dijkstra都差不多
dis[v[i]]=dis[u[i]]+w[i];
for(int i=1;i<=n;i++)
System.out.print(dis[i]+" ");
}
}
队列优化
package 啊哈;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
public class Bellman_Ford队列优化 {
static int[] u=new int[10];
static int[] v=new int[10];
static int[] w=new int[10];
static int[] first=new int[10];
static int[] next=new int[10];
static int n,m;
static Queue<Integer> q=new LinkedList<>();
static boolean book[]=new boolean[10];
static int[] dis=new int[10];
static int inf=99999999;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
Arrays.fill(u,0);
Arrays.fill(v,0);
Arrays.fill(w,0);
Arrays.fill(first,-1);
Arrays.fill(next,0);
Arrays.fill(dis,inf);
for(int i=1;i<=m;i++){
u[i]=sc.nextInt();
v[i]=sc.nextInt();
w[i]=sc.nextInt();
next[i]=first[u[i]];
first[u[i]]=i;
}
dis[1]=0;
q.add(1);
book[1]=true;
int k;
while(!q.isEmpty()){
k=first[q.peek()];
while(k!=-1){
if(dis[v[k]]>dis[u[k]]+w[k]){
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==false){
book[v[k]]=true;
q.add(v[k]);
}
}
k=next[k];
}
q.poll();
}
for(int i=1;i<=n;i++)
System.out.print(dis[i]+" ");
}
}