数据是不是有点问题啊

我邻接表开n+1, 可以过45%, 然后爆索引越界, 开200001能AC

import java.io.*;
import java.util.*;

public class Main {
   
    public static void main(String[] args) throws Exception {
        int n = I();
        int m = I();
        List<int[]>[] g = new ArrayList[200001];
        // List<int[]>[] g = new ArrayList[n+1]; // 这里用n+1,只能过45%, 下面的建图爆索引越界
        Arrays.setAll(g, k -> new ArrayList<>());
        for (int i = 0; i < m; i++) {
            int u = I(), v = I(), w = I(); 
            g[u].add(new int[]{v, w}); // u,v应该是小于等于n的, 开n+1没有理由在这越界吧, 数据出错了?
            g[v].add(new int[]{u, w});
        }
        //求1->n的最短路长度
        long[] dist = new long[n + 1];
        Arrays.fill(dist, Long.MAX_VALUE / 2);
        dist[1] = 0;
        boolean[] visited = new boolean[n + 1];
        Queue<V> queue = new PriorityQueue<>(Comparator.comparingLong(a -> a.weight));
        queue.add(new V(1, 0));

        while (!queue.isEmpty()) {
            V cur = queue.poll();
            if (visited[cur.v]) continue;
            visited[cur.v] = true;

            //更新邻居
            for (int[] e : g[cur.v]) {
                int to = e[0], weight = e[1];
                if (!visited[to] && dist[cur.v] + weight < dist[to]) {//从cur->to更短
                    dist[to] = dist[cur.v] + weight;
                    queue.add(new V(to, dist[to]));
                }
            }
        }
        System.out.println(dist[n] == Long.MAX_VALUE / 2 ? "qwb baka" : dist[n]);
    }
    static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in), 65535);
    static StreamTokenizer st = new StreamTokenizer(bf);

    static int I() throws IOException {
        st.nextToken();
        return (int) st.nval;
    }


    static class V {
        int v;
        long weight;

        public V(int v, long weight) {
            this.v = v;
            this.weight = weight;
        }
    }
}

全部评论

相关推荐

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