题
package package1;
import java.util.Arrays;
/**
* 保存内容的列表
*/
class List {
int[] weight;//权值
int[] sortYes;//可排序的权值
String[] str;//保存最后输出的路径
public List(int n) {
weight = new int[n];
sortYes = new int[n];
str = new String[n];
for (int i = 0; i < n; i++) {
weight[i] = Integer.MAX_VALUE;//初始值最大值,之后更新直接比较大小
sortYes[i] = Integer.MAX_VALUE;//寻找最小值所保存的列表
}
}
}
public class alg {
/**
* dijkstra{
* 加入第一个
*
* while 找最小{
* 去掉最小
* 加入其他,加上权值
* }
* }
*/
public static void dijkstra(int[][] g, List list, boolean direction) {
list.sortYes[0] = 0;//从第一个开始找,只需要为第一个赋值0
while(list.sortYes[min(list.sortYes)] != Integer.MAX_VALUE){//当最小值为MAX_VALUE的时候说明没有最小值了,已经结束
int point = min(list.sortYes);
list.sortYes[point] = Integer.MAX_VALUE;
for(int i = 1; i < g[0].length; i++){//加入其他,加上权值
if(g[point][i] != 0){//权值等于零直接跳过
if( point == 0){//第0个,直接加入
list.weight[i] = g[point][i];
list.sortYes[i] = g[point][i];
list.str[i] = (char)(point + 97) + " -> " + (char)(i + 97);//更新路径信息
if(!direction){//是无向图,让对称点=0
g[i][point] = 0;
}
}else{//不是 第0个
int weight = list.weight[point] + g[point][i];
if(weight < list.weight[i]){//把当前点的权值加上以当前点为起点的下一点的权值的和作为权值
list.weight[i] = weight;
list.sortYes[i] = g[point][i];
list.str[i] = list.str[point] + " -> " + (char)(97 + i);//更新路径信息
if(!direction){//是无向图,让对称点=0
g[i][point] = 0;
}
}
}
}
}
}
}
/**
* 求最小值的函数
* @param sortYes
* @return
*/
public static int min(int[] sortYes){
int t = sortYes[0];
int r = 0;
for(int i = 1; i < sortYes.length; i++){
if(sortYes[i] < t){
t = sortYes[i];
r = i;
}
}
return r;
}
/**
*初始化图
* @param g 图
* @param n 点
* @param direction 是否有向
*/
public static void initGraph(int[][] g, int[][] n, boolean direction) {
for (int[] ints : n) {
if (direction) {
g[ints[0] - 1][ints[1] - 1] = ints[2];
} else {
g[ints[0] - 1][ints[1] - 1] = ints[2];
g[ints[1] - 1][ints[0] - 1] = ints[2];
}
}
for (int[] ints : g) {
System.out.println(Arrays.toString(ints));
}
}
public static void main(String[] args) {
System.out.println("-----------------第一题------------------");
int[][] n = {{1,4,7},{2,1,3},{2,3,4},{3,5,6},{4,2,2},{4,3,5},{5,4,4}};
int[][] g = new int[5][5];
initGraph(g, n, true);
List list = new List(5);
dijkstra(g, list, true);
for(int i = 1; i < list.weight.length; i++){
System.out.println(list.str[i] + " >" + list.weight[i] + "<");
}
System.out.println("-----------------第二题------------------");
int[][] n1 = {{1,2,3},{1,4,4},{1,3,5},{2,5,3},{2,6,6},{4,3,2},{4,8,5},{4,5,1},{6,5,2},{6,10,5},{7,3,4},{7,8,3},{7,11,6},{9,8,6},{9,5,4},{9,10,3},{9,12,5},{11,12,8},{11,8,7},{12,10,9}};
int[][] g1 = new int[12][12];
initGraph(g1, n1, false);
List list1 = new List(12);
dijkstra(g1, list1, false);
for(int i = 1; i < list1.weight.length; i++){
System.out.println(list1.str[i] + " >" + list1.weight[i] + "<");
}
}
}
结果