算法总结六:图论中五花八门的算法

区别:
一。几种算法
普通BFS
Dijkstra
Bellman-Ford
Floyd-Warshall

二。配套:如何构建一个图
adjacency list节省空间,搜索时间慢
map占用空间,搜索时间快
adjacency matrix占用空间,搜索时间快

=================
1.BFS主要适用于无权重向图中搜索出步骤最少的路径,当方向图存在权重时,不再适用;
2.Dijkstra主要用于有权重的方向图中搜索出最短、cost最小的路径,但不适合于有负权重的情况。
视频讲解
对于有环图,和BFS一样,标志好已处理的节点避免进入死循环,可以支持;
3.Bellman-Ford:负权重
4.Floyd-Warshall: 本质是动态规划,解决任意两点间的最短路径。
Floyd能不能处理负权边??

=================
一。Dijkstra
1.1 定义

最短距离:
在这里插入图片描述

public class Dijkstra {
   
    /*
     * 参数adjMatrix:为图的权重矩阵,权值为-1的两个顶点表示不能直接相连
     * 函数功能:返回顶点0到其它所有顶点的最短距离,其中顶点0到顶点0的最短距离为0
     */
    public int[] getShortestPaths(int[][] adjMatrix) {
   
        int[] result = new int[adjMatrix.length];   //用于存放顶点0到其它顶点的最短距离
        boolean[] used = new boolean[adjMatrix.length];  //用于判断顶点是否被遍历
        used[0] = true;  //表示顶点0已被遍历
        for(int i = 1;i < adjMatrix.length;i++) {
   
            result[i] = adjMatrix[0][i];
            used[i] = false;
        }
    
        for(int i = 1;i < adjMatrix.length;i++) {
   
            int min = Integer.MAX_VALUE;    //用于暂时存放顶点0到i的最短距离,初始化为Integer型最大值
            int k = 0;
            for(int j = 1;j < adjMatrix.length;j++) {
     //找到顶点0到其它顶点中距离最小的一个顶点
                if(!used[j] && result[j] != -1 && min > result[j]) {
   
                    min = result[j];
                    k = j;
                }
            }
            used[k] = true;    //将距离最小的顶点,记为已遍历
            for(int j = 1;j < adjMatrix.length;j++) {
     //然后,将顶点0到其它顶点的距离与加入中间顶点k之后的距离进行比较,更新最短距离
                if(!used[j]) {
     //当顶点j未被遍历时
                    //首先,顶点k到顶点j要能通行;这时,当顶点0到顶点j的距离大于顶点0到k再到j的距离或者顶点0无法直接到达顶点j时,更新顶点0到顶点j的最短距离
                    if(adjMatrix[k][j] != -1 && (result[j] > min + adjMatrix[k][j] || result[j] == -1))
                        result[j] = min + adjMatrix[k][j];
                }
            }
        }
        return result;
    }
    
    public static void main(String[] args) {
   
        Dijkstra test = new Dijkstra();
        int[][] adjMatrix = {
   {
   0,6,3,-1,-1,-1},
                {
   6,0,2,5,-1,-1},
                {
   3,2,0,3,4,-1},
                {
   -1,5,3,0,2,3},
                {
   -1,-1,4,2,0,5},
                {
   -1,-1,-1,3,5,0}};
        int[] result = test.getShortestPaths(adjMatrix);
        System.out.println("顶点0到图中所有顶点之间的最短距离为:");
        for(int i = 0;i < result.length;i++) 
            System.out.print(result[i]+" ");
    }
}
 

from:https://blog.csdn.net/a143977552

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值