对于其原理还不是太懂。
package graph.OptimumBellmanFord;
import java.util.Scanner;
public class OptimumBellmanFord {
public static int Max_Value = 100000;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入顶点数和边数:");
int vertex = scanner.nextInt();
int edge = scanner.nextInt();
int[] queue = new int[vertex*edge];//用于存放顶点的队列
int head=0;
int tail=0; //队列的头尾指针
//顶点是否在queue中的标记
boolean[] books = new boolean[vertex];
//最短路径矩阵
int[] dis = new int[vertex];
int[] fromVertex = new int[edge];
int[] toVertex = new int[edge];
int[] edgeWeight = new int[edge];
//临界存储表
int[] first = new int[vertex];//数组的1-n号单元格存储1-n号顶点的第一条边的编号,初始化的时候没有边为-1
int[] next = new int[edge];//编号为i的边的下一条边
for (int i = 0; i < vertex; i++) {
dis[i]=Max_Value;
first[i] = -1;//-1表示当前顶点没有边
}
dis[0]=0;//出发点,所以为0
System.out.println("请输入各边对应的fromVertex toVertex edgeWeight:");
for (int i = 0; i < edge; i++) {
fromVertex[i] = scanner.nextInt();
toVertex[i] = scanner.nextInt();
edgeWeight[i] = scanner.nextInt();
//建立邻接表
next[i] = first[fromVertex[i]];//将现有的第一条边移到当前边的next
first[fromVertex[i]] = i;//把当前边变成第一条边
}
queue[tail++]=0;//0号顶点进入队列
books[0]=true;
while(head<tail){//队列不为空
int tmp = first[queue[head]];//处理队首顶点
while(tmp!=-1){//扫描当前顶点所有的边
if(dis[toVertex[tmp]]>dis[fromVertex[tmp]]+edgeWeight[tmp]){//判断是否松弛成功
dis[toVertex[tmp]]=dis[fromVertex[tmp]]+edgeWeight[tmp];//更新顶点0到顶点totarget的路程
if(!books[toVertex[tmp]]){
queue[tail++] = toVertex[tmp];
books[toVertex[tmp]] = true;//标记当前的节点进入队列
}
}
tmp=next[tmp];
}
//出队
books[queue[head++]]=false;
}
for (int i = 0; i < vertex; i++) {
System.out.println("0号顶点到"+i+"号顶点的距离为:"+dis[i]);
}
}
}
结果
"C:\Program Files\Java\jdk1.8.0_144\bin\java" "-javaagent:D:\software\IntelliJ IDEA 2017.3.5\lib\idea_rt.jar=49945:D:\software\IntelliJ IDEA 2017.3.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;E:\IdeaProjects\big_data\out\production\data-structure" graph.OptimumBellmanFord.OptimumBellmanFord
请输入顶点数和边数:
5 7
请输入各边对应的fromVertex toVertex edgeWeight:
0 1 2
0 4 10
1 2 3
1 4 7
2 3 4
3 4 5
4 2 6
0号顶点到0号顶点的距离为:0
0号顶点到1号顶点的距离为:2
0号顶点到2号顶点的距离为:5
0号顶点到3号顶点的距离为:9
0号顶点到4号顶点的距离为:9
Process finished with exit code 0