算法8-7:最短路径接口

最短路径问题就是给定一个图,这个图中的边是有方向和权重的。求s到t的最短路径。

最短路径问题其实分为很多种。按照起点和终点来分,可以分为:

  • 从一个顶点到另一个顶点
  • 从一个顶点到其他所有顶点
  • 从所有顶点到所有顶点

按照边的权重来分可以分为:

  • 非负权
  • 任意权
  • 欧几里德权

按照是否有环可以分为

  • 无环最短路径
  • 无负环最短路径

类的定义

在实现最短路径算法之前,需要先在程序中定义有向权重图。

有向权重边的定义如下:

public class DirectedEdge {
    private int v;
    private int w;
    private double weight;

    public DirectedEdge(int v, int w, double weight) {
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

    public int from() {
        return v;
    }

    public int to() {
        return w;
    }

    public double weight() {
        return this.weight;
    }

    @Override
    public String toString() {
        return String.format("%s->%s[%s]", v, w, weight);
    }
}

有向权重图的定义如下:

import java.util.LinkedList;

public class EdgeWeightedDigraph {
    private int V;
    private LinkedList<DirectedEdge>[] adj;

    public EdgeWeightedDigraph(int V) {
        this.V = V;
        adj = new LinkedList[V];
        for (int i = 0; i < V; i++) {
            adj[i] = new LinkedList<DirectedEdge>();
        }
    }

    public void addEdge(DirectedEdge edge) {
        int v = edge.from();
        adj[v].add(edge);
    }

    public Iterable<DirectedEdge> adj(int v) {
        return adj[v];
    }

    public int V() {
        return V;
    }

    public int E() {
        int result = 0;
        for (LinkedList<DirectedEdge> e : adj) {
            result += e.size();
        }
        return result;
    }

    @Override
    public String toString() {
        String result = "";
        for (int i = 0; i < adj.length; i++) {
            result += i + ":";
            for (DirectedEdge e : adj[i]) {
                result += String.format(" %s[%s]", e.to(), e.weight());
            }
        }
        return result;
    }
}

这样定义有向权重图的好处就是可以有自连接,可以实现顶点之间有多个连接。

最短路径算法类的接口如下:

public class SP {
    public double distTo(int v);
    public Iterable<DirectedEdge> pathTo(int v);
}

算法8-7:最短路径接口

时间: 2024-08-24 13:24:50

算法8-7:最短路径接口的相关文章

编程算法 - 迷宫的最短路径 代码(C++)

迷宫的最短路径 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个大小为N*M的迷宫. 迷宫由通道和墙壁组成, 每一步可以向邻接的上下左右四格的通道移动. 请求出从起点到终点所需的最小步数. 请注意, 本题假定从起点一定可以移动到终点. 使用宽度优先搜索算法(DFS), 依次遍历迷宫的四个方向, 当有可以走且未走过的方向时, 移动并且步数加一. 时间复杂度取决于迷宫的状态数, O(4*M*N)=O(M*N). 代码: /* * m

算法7-2:图论接口

本节介绍如何在程序中表示一张图. 顶点 在程序中,顶点用整数表示就可以了.因为整数可以作为数组的下标,也可以作为哈希表的键.所以用整数是最方便的. 当然,在一张图中可能会出现一些异常情况,比如自己连接自己,两个顶点之间存在多个边.这些异常情况也是要考虑的. 接口 为了表示一张图,就要创建专门的对象来保存图.这个对象起名叫做Graph好了.它的接口是下面这样的. public class Graph { // 创建一个带有V个顶点的图 Graph(int V); // 从输入流创建一张图,输入流的

算法8-10:最短路径算法之拓扑排序

该算法的基本思想就是按照拓扑排序的顺序依次将每个顶点加入到最短路径树中,每次加入时将该顶点延伸出的所有顶点进行"放松"操作.这种算法的复杂度是E+V. 代码 这种算法的代码比Dijkstra还要简单,代码如下: public class TopologySP extends SP { public TopologySP(EdgeWeightedDigraph G, int s) { super(G, s); // 将所有顶点到原点的距离设为无穷大 // 注意:下面这段代码不要遗漏 fo

算法8-11:最短路径算法之负权

负权指的是一张图中包含一条权重小于0的边.负环指的是一张图中存在权重只和为负数的环.如果一张图中存在负环,那么这张图是没有最短路径的. 那么,假设图中不存在负环,但是有负权,那么最短路径如何求解呢?答案就是使用Bellman-Ford算法,该算法的性能一般. 基本思想 Bellman-Ford算法的基本思想就是对图中所有的边都进行V次"放松"操作.所以该算法的复杂度是E×V. 该算法的计算过程如下图所示. 改进 实际应用中会对算法进行改进.改进方法就是用队列记录发生变化的顶点,这样能减

A星算法,找寻最短路径

#include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cmath> #define N 1000 #define inf 1<<30; using namespace std; /* a星算法,找寻最短路径 算法核心:有两个表open表和close表 将方块添加到open列表中,该列表有最小的和值.且将这个方块称为S吧

hdu 2680 最短路径(dijkstra算法+多源最短路径单源化求最小值)

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7062    Accepted Submission(s): 2301 Problem Description One day , Kiki wants to visit one of her friends. As she is liable

数据结构与算法--单源最短路径算法之dijkstra

单源最短路径之dijkstra算法 最优子问题:dis(s,...,e)是s到e的最短路径,在这条路径上的所有点之间dis(pi,pj)距离是最小的. 算法思路: 首先初始化,dis[s][i]是s到i的距离,直接相连的就是其距离,不直接相连的就是无穷大 下面是算法主要模块: 1.选取dis[i]最小的点加入到P{S}中, 2.计算是否更新dis[j],j是和i直接相连的 3.重复以上步骤,直到e

算法8-8:最短路径性质

在计算最短路径之前,往往会先计算最短路径树.也就是计算从一个顶点出发,到其余全部顶点的最短距离. 有了最短路径树之后.路径和距离就很easy实现了: public double distTo(int v) { return distTo[v]; } public Iterable<DirectedEdge> pathTo(int v) { Stack<DirectedEdge> result = new Stack<DirectedEdge>(); DirectedEd

(算法)无向图最短路径的数目

题目: 给定如下图所示的无向连通图,假定图中所有边的权值都为1:显然,从源点A到终点T的最短路径有多条,求不同的最短路径的数目.注:两条路径中有任意结点不同或者结点顺序不同,都称为不同的路径. 思路: 给定的图中,边权相等且非负,Dijkstra最短路径算法退化为BFS广度优先搜索.实现过程中可以使用队列.计算到某结点最短路径条数,只需计算与该结点相邻的结点的最短路径值和最短路径条数,把最短路径值最小且相等的最短路径条数加起来即可. 答案:12 代码: #include <iostream>