import com.sun.javafx.image.IntPixelGetter;
import java.util.*;
public class Main {
public static long count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入顶个的个数和边数:");
int vertex = sc.nextInt();//顶点的个数
int brim = sc.nextInt();//边
long[][] am = new long[vertex + 1][vertex + 1];//初始化矩阵
for (int i = 1; i <= vertex; i++) {
for (int j = 1; j <= vertex; j++) {
am[i][j] = Integer.MAX_VALUE;
}
}
System.out.println("输入顶点 --> 顶点的权值:");
for (int i = 1; i <= brim; i++) {
int form = sc.nextInt();
int to = sc.nextInt();
int res = sc.nextInt();
am[form][to] = res;
}
for (int i = 1; i <= vertex; i++) {
for (int j = 1; j <= vertex; j++) {
if (am[i][j] == Integer.MAX_VALUE)
System.out.print("∞ ");
else
System.out.print(am[i][j] + " ");
}
System.out.println();
}
System.out.println("请输入起始点:");
int initial_point = sc.nextInt();//起始点
long[] dis = new long[vertex + 1];
long[] flag = new long[vertex + 1];//标记不参与找最小值的点
int[] hs = new int[vertex + 1];//回溯找上一个节点
for (int i = 1; i <= vertex; i++) {
dis[i] = am[initial_point][i];//初始化起始点到这些顶点的距离
flag[i] = am[initial_point][i];
hs[i] = 1;//每一个节点的上一个节点都是1;
}
List list = new ArrayList();
dis[initial_point] = 0;
flag[initial_point] = Integer.MAX_VALUE;//将该点
list.add(initial_point);
while (list.size() != vertex) {
long min = Integer.MAX_VALUE;
int index = initial_point;
for (int i = 1; i <= vertex; i++) {
if (flag[i] < min) {
min = flag[i];
index = i;
}
}
list.add(index);
flag[index] = Integer.MAX_VALUE;
//寻找index节点出度,如果通过到这些出度的点的值小于直达的点,则更新里面的值。
for (int i = 1; i <= vertex; i++) {
if (dis[index] + am[index][i] < dis[i]) {
hs[i] = index;
dis[i] = am[index][i] + dis[index];
flag[i] = am[index][i] + dis[index];
}
}
}
for (int i = 1; i <= vertex; i++) {
StringBuffer sb = new StringBuffer();
//System.out.println(hs[i]);
System.out.println(pf(i,hs,sb)+"="+dis[i]);
}
}
public static StringBuffer pf(int i, int[] hs, StringBuffer sb) {
if (i == 1) {
sb.append("1");
}
else{
pf(hs[i], hs, sb);
sb.append("->" + i);
}
return sb;
}
}
运行结果和输入参数:
输入顶个的个数和边数:
6 8
输入顶点 --> 顶点的权值:
1 3 10
1 5 30
1 6 100
2 3 5
3 4 50
4 6 10
5 6 60
5 4 20
∞ ∞ 10 ∞ 30 100
∞ ∞ 5 ∞ ∞ ∞
∞ ∞ ∞ 50 ∞ ∞
∞ ∞ ∞ ∞ ∞ 10
∞ ∞ ∞ 20 ∞ 60
∞ ∞ ∞ ∞ ∞ ∞
请输入起始点:
1
1=0
1->2=2147483647
1->3=10
1->5->4=50
1->5=30
1->5->4->6=60