有向图、及其反向图

二、有向图

2.1 有向图的定义及相关术语

定义:

有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点。

出度:

由某个顶点指出的边的个数称为该顶点的出度。

入度:

指向某个顶点的边的个数称为该顶点的入度。

有向路径:

由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点。

有向环:

一条至少含有一条边,且起点和终点相同的有向路径。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y5RGSED4-1629735398090)(images/image68.png)]

一副有向图中两个顶点v和w可能存在一下四种关系:

  1. 没有边相连。
  2. 存在从v->w的边。
  3. 存在从w->v的边。
  4. 即存在v->w的边,也存在w->v的边,即双向连接。

2.2 有向图API设计

类名Digraph
构造方法Digraph(int V):创建一个包含V个顶点但不包含边的有向图
成员方法1.public int V():获取图中顶点的数量
2.public int E():获取图中边的数量
3.public void addEdge(int v,int w):向有向图中添加一条边 v->w
4.public Queue adj(int v):获取由v指出的边所连接的所有顶点
5.private Digraph reverse():该图的反向图
成员变量1.private final int V: 记录顶点数量
2.private int E: 记录边数量
3.private Queue[] adj: 邻接表

在api中设计了一个反向图,其因为有向图的实现中,用adj方法获取出来的是由当前顶点v指向的其他顶点,如果能得到其反向图,就可以很容易得到指向v的其他顶点。

2.3 有向图实现

/**
 * 有向图
 */
public class Digraph {
    // 顶点数目
    private final int V;
    // 边的数目
    private int E;
    // 邻接表
    private Queue<Integer>[] adj;

    public Digraph(int v) {
        // 初始化顶点数量
        this.V = v;
        // 初始化边的数量
        this.E = 0;
        // 初始化邻接表
        this.adj = new Queue[V];
        // 初始化邻接表中的空队列
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new Queue<Integer>();
        }
    }

    // 获取顶点数目
    public int V() {
        return V;
    }

    // 获取边的数目
    public int E() {
        return E;
    }

    // 向有向图中添加一条边 v->w
    public void addEdge(int v, int w) {
        // 有向图的边是有方向的,v->w,所以只需要让w出现在v的邻接表中
        adj[v].enqueue(w);
        // 边的数量+1
        E++;
    }

    // 获取由v指出的边所连接的所有顶点
    public Queue<Integer> adj(int v) {
        return adj[v];
    }

    // 该图的反向图
    public Digraph reverse() {
        // 创建有向图
        Digraph reverse = new Digraph(V);
        // 遍历0~V-1的所有顶点,拿到每一个顶点v
        for (int v = 0; v < V; v++) {
            // 得到v对应的邻接表,然后反向添加边(原v->w,现w->v)
            for (Integer w : adj[v]) {
                reverse.addEdge(w, v);
            }
        }
        return reverse;
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 MATLAB 中,你可以使用以下代码实现 Dijkstra 算法来求解有向图的最短路径: ```matlab function [distances, path] = Dijkstra(graph, startNode) numNodes = size(graph, 1); distances = inf(1, numNodes); distances(startNode) = 0; visited = false(1, numNodes); path = zeros(1, numNodes); for i = 1:numNodes currentNode = findMinDistance(distances, visited); visited(currentNode) = true; for j = 1:numNodes if ~visited(j) && graph(currentNode, j) > 0 newDistance = distances(currentNode) + graph(currentNode, j); if newDistance < distances(j) distances(j) = newDistance; path(j) = currentNode; end end end end end function minNode = findMinDistance(distances, visited) minDistance = inf; minNode = -1; for i = 1:length(distances) if ~visited(i) && distances(i) < minDistance minDistance = distances(i); minNode = i; end end end ``` 使用这个函数,你需要提供一个邻接矩阵 `graph` 表示有向图的连接关系。如果节点 `i` 和节点 `j` 之间存在一条有向边,那么 `graph(i,j)` 就是这条边的权重。如果不存在这条边,则 `graph(i,j)` 应该为 0 或者一个非正数。 此外,你还需要指定起始节点 `startNode`,它是中一个有效的节点索引。 函数将返回一个包含从起始节点到每个节点的最短距离的数组 `distances`,以及一个包含最短路径的前一个节点的数组 `path`。路径可以通过反向追踪 `path` 数组来重建。 例如,假设你有一个有向图的邻接矩阵 `graph` 和起始节点 `startNode`: ```matlab graph = [ 0 3 0 0 8; 0 0 2 0 0; 0 0 0 7 0; 0 0 0 0 1; 4 0 0 0 0 ]; startNode = 1; ``` 你可以调用 Dijkstra 算法并获取最短路径及其距离: ```matlab [distances, path] = Dijkstra(graph, startNode); ``` 现在,`distances` 和 `path` 将包含相应的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农村小白i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值