图——Bellman-Ford算法的队列优化

对于其原理还不是太懂。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值