leetcode裏和graph相關的題目根據解題思路能夠分紅如下幾個大類:node
有些題目的關鍵是如何建圖,兩種建圖形式:數組
圖的題目給咱們的經常是這三種形式:code
求最短路徑:leetcode
class Solution { public int networkDelayTime(int[][] times, int N, int K) { List<int[]>[] graph = new List[N+1]; for (int i = 1; i <= N; i ++) graph[i] = new ArrayList<>(); for (int[] time : times) graph[time[0]].add(new int[] {time[1], time[2]}); PriorityQueue<int[]> pq = new PriorityQueue<>((a, b)->Integer.compare(a[1], b[1])); int[] dist = new int[N+1]; Arrays.fill(dist, Integer.MAX_VALUE); dist[K] = 0; pq.offer(new int[] {K, 0}); int max = 0; while (!pq.isEmpty()) { int[] node = pq.poll(); int u = node[0]; max = Math.max(max, dist[u]); for (int[] edge : graph[u]) { int v = edge[0]; int d = edge[1]; if (dist[u]+d < dist[v]) { dist[v] = dist[u]+d; pq.offer(new int[] {v, dist[v]}); } } } for (int i = 1; i <= N; i ++) if (dist[i] == Integer.MAX_VALUE) return -1; return max; } }
2、不須要初始化爲INF
class Solution { public int networkDelayTime(int[][] times, int N, int K) { boolean[] used = new boolean[N+1]; int[][] graph = new int[N+1][N+1]; for (int i = 1; i <= N; i ++) { for (int j = 1; j <= N; j ++) graph[i][j] = -1; } for (int[] time : times) graph[time[0]][time[1]] = time[2]; PriorityQueue<int[]> pq = new PriorityQueue<>((a,b)->Integer.compare(a[1], b[1])); pq.offer(new int[] {K, 0}); int max = 0; while (!pq.isEmpty()) { int[] edge = pq.poll(); int u = edge[0]; int d = edge[1]; if (used[u]) continue; used[u] = true; max = Math.max(max, d); for (int i = 1; i <= N; i ++) { if (graph[u][i] == -1) continue; pq.offer(new int[] {i,d+graph[u][i]}); } } for (int i = 1; i <= N; i ++) if (!used[i]) return -1; return max; } }