public class Main {
static int n=19;//一共19个结点
static int N=100;//根据边数设数组的大小
static int arcs[][]=new int[N][N];//用来储存各顶点之间的权值
static void add(char a,char b,int c){//将边之间的权值转化为数组
int x=a-'A';
int y=b-'A';
arcs[x][y]=arcs[y][x]=c;
}
public static void main(String[] args) {
for(int i=0;i<n;i++){//将所有边之间的权值设为无穷大
for(int j=0;j<n;j++){
arcs[i][j]=Integer.MAX_VALUE>>1;//防止溢出变为最小值
}
}
arcs[0][0]=0;//第一个点到第一个点之间的权值为0
add('A','B',2);
add('A','C',1);
add('A','D',1);
add('A','E',1);
add('B','G',1);
add('B','J',2);
add('C','D',3);
add('C','G',3);
add('C','F',3);
add('D','E',1);
add('D','I',2);
add('D','H',1);
add('D','G',2);
add('E','I',3);
add('E','H',1);
add('F','G',1);
add('F','J',1);
add('G','I',3);
add('G','K',2);
add('H','I',1);
add('H','L',2);
add('I','M',3);
add('J','S',2);
add('K','L',3);
add('K','P',2);
add('K','N',1);
add('L','M',1);
add('L','R',1);
add('M','N',2);
add('M','Q',1);
add('M','S',1);
add('N','P',1);
add('O','Q',1);
add('O','R',3);
add('O','P',1);
add('R','S',1);
System.out.println(Dijkstra());
}
static int Dijkstra(){
int dist[]=new int[N];//赋权值
int path[]=new int[N];//赋前驱结点
boolean visit[]=new boolean[N];//赋标志,如果作为前驱访问过所有相邻结点则赋为true
int k=0;//用来记录最小权值的位置
int v=0;//开始结点
for(int i=0;i<n;i++){//初始化
dist[i]=arcs[v][i];//开始时,dist内的值是第一个结点到个节点的权值
path[i]=v;//所有结点的前驱结点都是第一个节点
visit[i]=false;//其余结点都没有被访问过
}
visit[v]=true;//初始化后,第一个结点作为前驱结点全都访问过
for(int i=1;i<n;i++){//对其余结点进行循环
int min=Integer.MAX_VALUE;//赋一个无穷大值,这里要注意每次循环结束min变为无穷大,才能在剩下的边中寻找最小值
for(int j=0;j<n;j++){//在dist中找最小
if(!visit[j] && dist[j]<min){//如果没有被访问过,并且当前dist中的值比最小值小
if(dist[j]!=0) {
min = dist[j];//将当前最小的dist记录下来
k = j;//将最小dist结点用k记录下来
}
}
}
visit[k]=true;
for (int w=0;w<n;w++){//更新dist
if(!visit[w] && (min+arcs[k][w])<dist[w]){//如果该结点没有被访问过,并且前驱结点加上当前边的权值小于,当前dist中的值
dist[w]=min+arcs[k][w];//将更小的路径权值更新到dist中
path[w]=k;
}
}
}
return dist[n-1];//返回dist数组的最后一个元素,即S点
}
}
蓝桥杯最短路径(JAVA解法)
这篇文章展示了如何在Java中使用Dijkstra算法解决图中两个顶点之间的最短路径问题,通过定义弧的权重和使用Dijkstra函数计算从起始点到其他节点的最短路径。
摘要由CSDN通过智能技术生成