图的算法——求两顶点间的所有路径

 
//求顶点start到end之间步数不超过maxStops步的所有路径
public int numStops(int start, int end, int maxStops) throws Exception {
        boolean[] visited = new boolean[listDG.mVexs.length];
        for (int i = 0; i < listDG.mVexs.length; i++) {
            visited[i] = false;
        }
        return findRoutes(visited, start, end, 0, maxStops);
    }

    private int findRoutes(boolean[] visited, int start, int end, int depth, int maxStops) throws Exception {
        int routes = 0;
        ListDG.ENode eNode = listDG.mVexs[start].firstEdge;
        visited[start] = true;
        while (eNode != null) {
            depth += 1;
            if (depth <= maxStops) {
                if (eNode.ivex == end) {
                    routes++;
                    visited[eNode.ivex]=true;
                    eNode =eNode.nextEdge;
                    continue;
                } else if (!visited[eNode.ivex]) {
                    routes += findRoutes(visited, eNode.ivex, end, depth, maxStops);
                    depth--;
                }
            } else {
                depth--;
            }
            eNode = eNode.nextEdge;
        }
        visited[start] = false;
        return routes;
    }

 

转载于:https://my.oschina.net/u/2263272/blog/1611363

给定邻接矩阵的强连通,可以使用Kosaraju算法。以下是一个用Python实现的示例代码: ```python from collections import defaultdict class Graph: def __init__(self, vertices): self.V = vertices self.graph = defaultdict(list) def addEdge(self, u, v): self.graph[u].append(v) def DFSUtil(self, v, visited): visited[v] = True print(v, end=" ") for i in self.graph[v]: if visited[i] == False: self.DFSUtil(i, visited) def fillOrder(self, v, visited, stack): visited[v] = True for i in self.graph[v]: if visited[i] == False: self.fillOrder(i, visited, stack) stack.append(v) def getTranspose(self): g = Graph(self.V) for i in self.graph: for j in self.graph[i]: g.addEdge(j, i) return g def printSCCs(self): stack = [] visited = [False] * (self.V) for i in range(self.V): if visited[i] == False: self.fillOrder(i, visited, stack) gr = self.getTranspose() visited = [False] * (self.V) while stack: v = stack.pop() if visited[v] == False: gr.DFSUtil(v, visited) print() # 示例用法 g1 = Graph(5) g1.addEdge(1, 0) g1.addEdge(0, 2) g1.addEdge(2, 1) g1.addEdge(0, 3) g1.addEdge(3, 4) print("强连通分量为:") g1.printSCCs() ``` 这段代码首先定义了一个 `Graph` 类,其中 `addEdge` 方法用于添加边。`DFSUtil` 方法是深度优先搜索的辅助函数,用于遍历中的顶点。`fillOrder` 方法用于填充顶点的遍历顺序。`getTranspose` 方法用于获取的转置(即将边的方向反转)。`printSCCs` 方法是实现强连通分量的核心函数。 在示例中,我们创建了一个包含 5 个顶点,并添加了几条边。然后调用 `printSCCs` 方法来获取强连通分量。输出结果将显示强连通分量的顶点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值