標籤:
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.
解題思路一:
把每個節點放到圖裡,然後對每個節點進行BFS,如果出現自環,則為false,否則返回true,JAVA實現如下:
static public boolean canFinish(int numCourses, int[][] prerequisites) { if (prerequisites.length == 0 || prerequisites[0].length == 0) return true; HashMap<Integer, UndirectedGraphNode> hm = new HashMap<Integer, UndirectedGraphNode>(); for (int[] nums : prerequisites) for (int i = 0; i < nums.length - 1; i++) { if (!hm.containsKey(nums[i])) hm.put(nums[i], new UndirectedGraphNode(nums[i])); if (!hm.containsKey(nums[i + 1])) hm.put(nums[i + 1], new UndirectedGraphNode(nums[i + 1])); hm.get(nums[i]).neighbors.add(hm.get(nums[i + 1])); } Iterator<Integer> iterator = hm.keySet().iterator(); while (iterator.hasNext()) if (haveLoop(hm.get(iterator.next()))) return false; return true;}static boolean haveLoop(UndirectedGraphNode root) {HashMap<UndirectedGraphNode, Boolean> hm = new HashMap<UndirectedGraphNode, Boolean>();Queue<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>();hm.put(root, true);queue.add(root);while (!queue.isEmpty()) {UndirectedGraphNode temp = queue.poll();for (UndirectedGraphNode temp2 : temp.neighbors) {if (temp2 == root)return true;if (!hm.containsKey(temp2)) {hm.put(temp2, true);queue.add(temp2);}}}return false;}
結果TLE,問題在於判斷有向圖是否有環的時候,對每一個節點判斷其實浪費了很多時間%>_<%
Java for LeetCode 207 Course Schedule 【Unsolved】