蓝桥杯最短路径(JAVA解法)

这篇文章展示了如何在Java中使用Dijkstra算法解决图中两个顶点之间的最短路径问题,通过定义弧的权重和使用Dijkstra函数计算从起始点到其他节点的最短路径。
摘要由CSDN通过智能技术生成

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点
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值