You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改BFS最短路径代码计算无向图两节点间最长路径边数

最长路径边数计算修改方案

你当前使用的BFS算法天生适用于最短路径求解,因为它按层遍历节点,首次到达目标节点时的路径就是最短路径。但最长路径属于NP难问题,对于你当前的小规模无环图场景,可以用DFS回溯的方式遍历所有可达路径,记录到达目标节点的最大边数即可。

核心修改思路

  • 丢弃原有的全局访问标记逻辑,改为每次递归时维护当前路径的访问节点标记,避免重复走同一个节点形成环路
  • 每次到达目标节点时,对比更新当前记录的最大边数
  • 递归探索完某个邻接节点的所有路径后,回溯取消该节点的访问标记,供其他路径使用

修改后的完整代码

import java.util.Vector;

class Test {
    // 存储最大边数结果
    static int maxEdgeCount = 0;

    // DFS回溯求最长路径边数
    static void dfs(Vector<Integer> edges[], boolean[] currentVisited, int currentNode, int target, int currentDistance, int n) {
        // 到达目标节点,更新最大边数
        if (currentNode == target) {
            maxEdgeCount = Math.max(maxEdgeCount, currentDistance);
            return;
        }
        // 遍历所有邻接节点
        for (int neighbor : edges[currentNode]) {
            if (!currentVisited[neighbor]) {
                currentVisited[neighbor] = true;
                dfs(edges, currentVisited, neighbor, target, currentDistance + 1, n);
                // 回溯,取消标记
                currentVisited[neighbor] = false;
            }
        }
    }

    static int maxEdgeDFS(Vector<Integer> edges[], int u, int v, int n) {
        maxEdgeCount = 0;
        boolean[] currentVisited = new boolean[n];
        currentVisited[u] = true;
        dfs(edges, currentVisited, u, v, 0, n);
        return maxEdgeCount;
    }

    // 加边方法保持不变
    static void addEdge(Vector<Integer> edges[], int u, int v) {
        edges[u].add(v);
        edges[v].add(u);
    }

    public static void main(String args[]) {
        int n = 11;
        Vector<Integer> edges[] = new Vector[11];

        for (int i = 0; i < edges.length; i++) {
            edges[i] = new Vector<>();
        }

        addEdge(edges, 0, 1);
        addEdge(edges, 1, 2);
        addEdge(edges, 1, 7);
        addEdge(edges, 1, 6);
        addEdge(edges, 2, 8);
        addEdge(edges, 3, 1);
        addEdge(edges, 3, 4);
        addEdge(edges, 3, 9);
        addEdge(edges, 5, 3);
        addEdge(edges, 5, 9);
        addEdge(edges, 8, 10);
        int u = 6;
        int v = 9;
        // 调用新的最长路径方法
        System.out.println(maxEdgeDFS(edges, u, v, n));
    }
}

运行说明

运行上述代码后输出结果为4,对应你需要的最长路径6-1-3-5-9的边数。
注意:该方案仅适用于节点规模较小的图,如果图规模较大且存在环,需要额外处理或改用针对特定图结构(如有向无环图)的最长路径优化算法。

内容的提问来源于stack exchange,提问作者user8021744

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:15:03