小美的修路

https://ac.nowcoder.com/acm/problem/261579

有没有大佬帮忙看看,为什么这个的通过率只有10% 找不出逻辑错误了

import java.util.Scanner;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    private static int[] father;
    static final int N = (int)1e5 + 10;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n = in.nextInt(); // 城市数量
        int m = in.nextInt(); // 可选择的计划的数量
        int[][] roads = new int[m][5];
        for (int i = 0; i < m; i++) {
            roads[i][0] = i + 1;
            roads[i][1] = in.nextInt();
            roads[i][2] = in.nextInt();
            roads[i][3] = in.nextInt();
            roads[i][4] = in.nextInt();
        }
        Arrays.sort(roads, (int[] a, int[] b) -> {
            if (a[4] != b[4]) {
                return Integer.compare(b[4], a[4]); // 最后一列为1的排在前面
            } else {
                return Integer.compare(a[3], b[3]); // 最后一列相同时按第三列排序
            }
        });
        int sum = 0;
        father = new int[N];
        init();
        HashSet<Integer> set = new HashSet<>();
        LinkedList<Integer> list = new LinkedList<>();
        for (int i = 0; i < m; i++) {
            if (roads[i][4] == 1) {
                join(roads[i][1], roads[i][2]);
                set.add(roads[i][1]);
                set.add(roads[i][2]);
                sum++;
                list.add(roads[i][0]);
            } else {
                if (isSame(roads[i][1], roads[i][2])) {
                    continue;
                } else {
                    join(roads[i][1], roads[i][2]);
                    sum++;
                    set.add(roads[i][1]);
                    set.add(roads[i][2]);
                    list.add(roads[i][0]);
                }
            }
            if (set.size() == n) {
                break;
            }
        }

        if (set.size() < n) {
            System.out.println(-1);
        } else {
            System.out.println(sum);
            for (int j = 0; j < list.size(); j++) {
                System.out.print(list.get(j));
                System.out.print(" ");
            }
        }
    }

    public static void init() {
        for (int i = 0; i < father.length; i++) {
            father[i] = i;
        }
    }

    public static int find(int u) {
        if (u == father[u]) {
            return u;
        } else {
            father[u] = find(father[u]);
            return father[u];
        }
    }

    public static boolean isSame(int u, int v) {
        return find(u) == find(v);
    }

    public static void join(int u, int v) {
        u = find(u);
        v = find(v);
        if (u == v) {
            return;
        } else {
            father[v] = u;
        }
    }
}

#刷题找工作啊##刷题日记#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务