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; } }