Java选手求助-dijkstra
查看原帖
Java选手求助-dijkstra
997832
yahuac楼主2023/12/26 10:39

如题,用的Java,算法是小根堆优化版的dijkstra算法,但是只能过2个用例,后面三个用例全t了,输入输出也优化了,求大佬帮忙解惑为什么过不了?

import javax.swing.*;
import java.io.*;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {

    static final int N = (int) 1e6 + 5;
    static final int M = 2 * N;
    static final int MOD=100003;

    static int inx;
    static int[] head = new int[N];
    static int[] to = new int[M];
    static int[] next = new int[M];

    static int[] ans=new int[N];
    static int[] distance = new int[N];
    static boolean[] visit = new boolean[N];
    static PriorityQueue<int[]> heap = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);

    public static void main(String[] args) throws IOException {
        Scanner br=new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

        int n = br.nextInt();
        int m = br.nextInt();

        Initi(n);   // 初始化方法

        for (int i = 0, u, v; i < m; ++i) {
            u = br.nextInt();
            v = br.nextInt();
            
            // 建图-无向图
            addEdge(u, v);
            addEdge(v, u);
        }
        
        // 算法方法
        dijkstra();

        for(int i=1; i<=n; ++i){
            pw.println(ans[i]);
        }
        pw.close();
        br.close();
    }

    public static void dijkstra() {
        ans[1]=1;
        distance[1] = 0;
        heap.add(new int[]{1, 0});

        while (!heap.isEmpty()) {
            int u = heap.poll()[0];
            if (visit[u]) {
                continue;
            }
            visit[u] = true;

            for (int ei = head[u], v; ei != 0; ei = next[ei]) {
                v = to[ei];

                if (distance[u] + 1 == distance[v]) {
                    // 如果当时路劲相当,那么就可以认为从1过u,到达v的距离与不经过u的距离是一样的,同样属于最短路
                    // 这样的话,两条路径相加即可
                    ans[v] +=ans[u];
                    ans[v]%=MOD;
                }
                else if(distance[u] + 1 < distance[v]) {
                    // 如果当前路径不是最短路,那么将ans中存储的就是替换成最短路径的条数
                    // 最短路径条数替换
                    ans[v]=ans[u];
                    distance[v] = distance[u] + 1;
                    if(!visit[v]){
                        heap.add(new int[]{v, distance[v]});
                    }
                }
            }
        }
    }


    public static void addEdge(int u, int v) {
        to[inx] = v;
        next[inx] = head[u];
        head[u] = inx++;
    }

    public static void Initi(int n) {
        inx = 1;
        heap.clear();
        Arrays.fill(ans,1,n+1,0);
        Arrays.fill(head, 1, n + 1, 0);
        Arrays.fill(visit, 1, n + 1, false);
        Arrays.fill(distance, 1, n + 1, Integer.MAX_VALUE);
    }
}
2023/12/26 10:39
加载中...