注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
本帖最后由 云水遥遥 于 2021-11-20 16:55 编辑
https://leetcode.com/problems/nu ... ive-at-destination/注释掉的是我自己写的dfs,未注释的是使用minHeap的bfs,如何计算这两种方法的时间复杂度,求教嘎人们!
// int[][] record;
// List<int[]>[] graph;
// int MOD = 1000000007;
// public int countPaths(int n, int[][] roads) {
// record = new int[n][2];
// for(int i = 0; i < n; i++) {
// Arrays.fill(record, -1);
// }
// graph = new List[n];
// for(int i = 0; i < n; i++) {
// graph = new ArrayList<>();
// }
// buildGraph(roads);
// dfs(0, -1, 0);
// return record[n-1][1];
// }
// private void dfs(int cur, int parent, int curDis) {
// if(record[cur][0] == -1 || record[cur][0] > curDis) {
// record[cur][0] = curDis;
// record[cur][1] = 1;
// }
// else{
// record[cur][1]++;
// record[cur][1] %= MOD;
// }
// for(int[] next_dis : graph[cur]) {
// int next = next_dis[0], dis = next_dis[1];
// if(record[next][0] != -1 && (next == parent || record[next][0] < curDis + dis)) continue;
// dfs(next, cur, curDis + dis);
// }
// }
// private void buildGraph(int[][] roads) {
// for(int[] road : roads) {
// graph[road[0]].add(new int[]{road[1], road[2]});
// graph[road[1]].add(new int[]{road[0], road[2]});
// }
// }
public int countPaths(int n, int[][] roads) {
List<int[]>[] graph = new List[n];
for (int i = 0; i < n; i++) graph = new ArrayList<>();
for (int[] e : roads) {
graph[e[0]].add(new int[]{e[1], e[2]});
graph[e[1]].add(new int[]{e[0], e[2]});
}
return dijkstra(graph, n, 0);
}
int dijkstra(List<int[]>[] graph, int n, int src){
int[] dist = new int[n];
Arrays.fill(dist, Integer.MAX_VALUE);
int[] ways = new int[n];
ways[src] = 1;
dist[src] = 0;
PriorityQueue<int[]> minHeap = new PriorityQueue<>((a,b)->a[0] - b[0]);
minHeap.offer(new int[]{0, 0}); // dist, src
while (!minHeap.isEmpty()) {
int[] top = minHeap.poll();
int d = top[0], u = top[1];
if (d > dist) continue;
for (int[] nei : graph) {
int v = nei[0], time = nei[1];
if (dist[v] > d + time) {
dist[v] = d + time;
ways[v] = ways;
minHeap.add(new int[]{dist[v], v});
} else if (dist[v] == d + time) {
ways[v] = (ways[v] + ways) % 1_000_000_007;
}
}
}
return ways[n-1];
}
|