题目链接:https://leetcode.com/problems/course-schedule/
There are a total of n courses you have to take, labeled from 0
to n - 1
.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses
For example:
2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.
2, [[1,0],[0,1]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.
Note:
The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
Subscribe to see which companies asked this question
这是一道图论的题目,考察的是拓扑排序。拓扑排序需要邻接表存储图。四年没用邻接表了,复习了下邻接表再来做的这个题目。
拓扑排序的思路:
package march; import java.util.ArrayDeque; import java.util.Queue; /** * Created by Administrator on 2016/6/17. */ public class CourseSchedule { public static void main(String[] args) { CourseSchedule cs = new CourseSchedule(); int[][] a = {{0, 1}}; System.out.println(cs.canFinish(2, a)); int[][] b = {{0, 1}, {1, 0}}; System.out.println(cs.canFinish(2, b)); } public boolean canFinish(int numCourses, int[][] prerequisites) { Edge[] edges = new Edge[numCourses]; int[] indgree = new int[numCourses]; boolean[] visited = new boolean[numCourses]; for (int i = 0; i < numCourses; i++) edges[i] = new Edge(-1); for (int i = 0; i < prerequisites.length; i++) { int[] edge = prerequisites[i]; Edge e = new Edge(edge[1]); int edgeHead = edge[0]; e.next = edges[edgeHead].next; edges[edgeHead].next = e; indgree[edge[1]]++; } Queue<Integer> q = new ArrayDeque<Integer>(numCourses); for (int i = 0; i < numCourses; i++) { if (indgree[i] == 0) q.add(i); } if (q.isEmpty()) return false; while (!q.isEmpty()) { int ver = q.poll(); visited[ver] = true; Edge head = edges[ver].next; while (head != null) { if (--indgree[head.num] == 0) q.add(head.num); head = head.next; } } boolean result = true; for (boolean v : visited) result &= v; return result; } } class Edge { public Edge(int n) { num = n; } public int num; public Edge next = null; }
2014-10-15
2016-06-06
2013-05-06
yershop商城系统开发一——thinkphp和onethink简析
2016-06-08
013--Floyd算法-动态规划-《算法设计技巧与分析》M.H.A学习笔记
2016-06-28
解决Visual Studio 2010下TFS服务无法连接问题
2014-05-30
2016-06-06
2013-05-06
2022-03-16
2022-03-16
2022-03-16
Redis之RedisTemplate配置方式(序列和反序列化)
2022-03-16
2022-03-16
2022-03-16
2022-03-16
2019-07-10
热门源码