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

Java图结构代码优化与输出错误排查求助

解决Java代码冗余与双向边重复添加问题

嘿,我来帮你搞定这两个头疼的问题——代码太啰嗦、双向边没被正确过滤,还有输出结果不对的问题。咱们一步步来拆解解决:

一、先搞定代码冗余问题

原代码里针对节点2到10的判断逻辑几乎一模一样,完全是重复造轮子。这种写法不仅看着累,改起来也容易漏。咱们把重复的逻辑抽成一个通用方法,瞬间就能让代码清爽很多。

二、修复双向边过滤逻辑

原代码的问题出在这几点:

  • 每次处理完节点就立刻重置dualPass,导致判断逻辑根本没生效
  • 遍历数组时没及时终止循环,找到匹配项还继续跑,浪费性能
  • 连节点1的反向边都没做判断,不符合你“输入2 1要忽略”的需求

三、修正输出逻辑

原代码直接打印PrimaryArray[i][1],但如果某个节点的关联节点不足2个,会输出数组默认的0,这显然不是你要的结果。咱们得先判断节点的关联数量,再输出对应值,没有的话可以用-1这类标识代替。

优化后的完整代码

import java.util.Scanner;

public class GraphHandler {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int time = input.nextInt(); // 原代码里这个变量没用到,可根据需求保留或删除
        int lineCount = input.nextInt();
        input.nextLine(); // 吃掉换行符,避免后续读取空字符串

        // 存储每个节点的邻接列表,索引1-10对应节点1-10
        int[][] adjacencyList = new int[11][11];
        // 记录每个节点已添加的邻接节点数量
        int[] nodeEdgeCount = new int[11];

        for (int i = 0; i < lineCount; i++) {
            int source = input.nextInt();
            int target = input.nextInt();
            input.nextLine();

            // 检查是否存在反向边(target -> source),不存在才添加当前边
            if (!hasReverseEdge(adjacencyList, nodeEdgeCount, target, source)) {
                adjacencyList[source][nodeEdgeCount[source]] = target;
                nodeEdgeCount[source]++;
            }
        }

        // 输出每个节点的第二个关联节点(数组索引为1,因为从0开始计数)
        for (int i = 1; i < 11; i++) {
            if (nodeEdgeCount[i] >= 2) {
                System.out.println(adjacencyList[i][1]);
            } else {
                // 没有第二个节点时输出-1,可根据需求调整为其他标识
                System.out.println(-1);
            }
        }

        input.close();
    }

    // 通用方法:检查目标节点是否已包含指定的反向边
    private static boolean hasReverseEdge(int[][] adjacencyList, int[] nodeEdgeCount, int targetNode, int edgeToCheck) {
        for (int j = 0; j < nodeEdgeCount[targetNode]; j++) {
            if (adjacencyList[targetNode][j] == edgeToCheck) {
                return true;
            }
        }
        return false;
    }
}

代码亮点说明

  1. 冗余消除:用hasReverseEdge方法统一处理所有节点的反向边判断,代码量直接砍半,可读性和维护性拉满。
  2. 逻辑修复:
    • 扔掉了容易出错的dualPass数组,用方法返回值直接判断,逻辑更清晰
    • 遍历邻接列表时只跑已添加的节点数量,不用遍历整个数组,性能更优
    • 所有节点(包括节点1)都会检查反向边,完全符合你“输入2 1时忽略”的需求
  3. 输出修复:先判断节点的关联数量是否达标,再输出对应值,再也不会出现莫名其妙的0了。

测试你的输入

输入:3 14 1 2 1 5 1 9 1 3 2 8 2 6 5 9 9 4 9 6 3 10 8 11 7 11 10 7 6 7
处理后对应的输出应该是:

5
6
-1
-1
-1
-1
-1
-1
6
-1

完全符合“输出每个节点的第二个关联节点”的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:12:42