Course Schedule
2015-07-27 07:42
302 查看
DFS without HashMap
public class Solution {
class DiGraph{
int V;
List<Integer>[] adj;
public DiGraph(int v) {
V = v;
adj = new List[v];
for (int i = 0; i < V; i++) {
adj[i] = new ArrayList<Integer>();
}
}
public void addEdge (int u, int w) {
adj[u].add(w);
}
}
public boolean canFinish(int numCourses, int[][] prerequisites) {
DiGraph g = new DiGraph(numCourses);
for (int[] courses : prerequisites) {
g.addEdge(courses[1], courses[0]);
}
boolean[] onStack = new boolean[numCourses];
for (int i = 0; i < numCourses; i++) {
if (!dfs(g, onStack, i)) {
return false;
}
}
return true;
}
private boolean dfs(DiGraph g, boolean[] onStack, int v) {
onStack[v] = true;
for (int w : g.adj[v]) {
if (onStack[w] || !dfs(g, onStack, w)) {
return false;
}
}
onStack[v] = false;
return true;
}
}DFS with HashMap
Solution 1:(debug)
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if (prerequisites == null) {
return false;
}
int length = prerequisites.length;
if (numCourses == 0 || length == 0) {
return true;
}
boolean[] onStack = new boolean[numCourses];
boolean[] visited = new boolean[numCourses];
Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
for (int[] courses : prerequisites) {
if (map.containsKey(courses[1])) {
map.get(courses[1]).add(courses[0]);
} else {
List<Integer> temp = new ArrayList<Integer>();
temp.add(courses[0]);
map.put(courses[1], temp);
}
}
for (int i = 0; i < numCourses; i++) {
if (!dfs(map, onStack, i)) {
return false;
}
}
return true;
}
private boolean dfs(Map<Integer, List<Integer>> map, boolean[] onStack, int i) {
if (visited[i] == true) {
return true;
}
onStack[i] = true;
if (map.containsKey(i)) {
for (int v : map.get(i)) {
if (onStack[v] || !dfs(map, onStack, v)) {
return false;
}
}
}
onStack[i] = false;
visited[i] = true;
return true;
}
}Solution 2: 利用剪枝,缩短DFS计算时间
BFS without HashMap
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if (prerequisites == null) {
return false;
}
int length = prerequisites.length;
if (numCourses == 0 || length == 0) {
return true;
}
int[] preCount = new int[numCourses];
for (int i = 0; i < length; i++) {
preCount[prerequisites[i][0]]++;
}
Queue<Integer> q = new LinkedList<Integer>();
for (int i = 0; i < numCourses; i++) {
if (preCount[i] == 0) {
q.offer(i);
}
}
int numNoPre = q.size();
while (!q.isEmpty()) {
int course = q.poll();
for (int i = 0; i < length; i++) {
if (prerequisites[i][1] == course) {
preCount[prerequisites[i][0]]--;
if (preCount[prerequisites[i][0]] == 0) {
numNoPre++;
q.offer(prerequisites[i][0]);
}
}
}
}
return numNoPre == numCourses;
}
}BFS with HashMap
public class Solution {
class DiGraph{
int V;
List<Integer>[] adj;
public DiGraph(int v) {
V = v;
adj = new List[v];
for (int i = 0; i < V; i++) {
adj[i] = new ArrayList<Integer>();
}
}
public void addEdge (int u, int w) {
adj[u].add(w);
}
}
public boolean canFinish(int numCourses, int[][] prerequisites) {
DiGraph g = new DiGraph(numCourses);
for (int[] courses : prerequisites) {
g.addEdge(courses[1], courses[0]);
}
boolean[] onStack = new boolean[numCourses];
for (int i = 0; i < numCourses; i++) {
if (!dfs(g, onStack, i)) {
return false;
}
}
return true;
}
private boolean dfs(DiGraph g, boolean[] onStack, int v) {
onStack[v] = true;
for (int w : g.adj[v]) {
if (onStack[w] || !dfs(g, onStack, w)) {
return false;
}
}
onStack[v] = false;
return true;
}
}DFS with HashMap
Solution 1:(debug)
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if (prerequisites == null) {
return false;
}
int length = prerequisites.length;
if (numCourses == 0 || length == 0) {
return true;
}
boolean[] onStack = new boolean[numCourses];
boolean[] visited = new boolean[numCourses];
Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
for (int[] courses : prerequisites) {
if (map.containsKey(courses[1])) {
map.get(courses[1]).add(courses[0]);
} else {
List<Integer> temp = new ArrayList<Integer>();
temp.add(courses[0]);
map.put(courses[1], temp);
}
}
for (int i = 0; i < numCourses; i++) {
if (!dfs(map, onStack, i)) {
return false;
}
}
return true;
}
private boolean dfs(Map<Integer, List<Integer>> map, boolean[] onStack, int i) {
if (visited[i] == true) {
return true;
}
onStack[i] = true;
if (map.containsKey(i)) {
for (int v : map.get(i)) {
if (onStack[v] || !dfs(map, onStack, v)) {
return false;
}
}
}
onStack[i] = false;
visited[i] = true;
return true;
}
}Solution 2: 利用剪枝,缩短DFS计算时间
public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { if (prerequisites == null) { return false; } int length = prerequisites.length; if (numCourses == 0 || length == 0) { return true; } int[] visited = new int[numCourses]; Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>(); for (int[] courses : prerequisites) { if (map.containsKey(courses[1])) { map.get(courses[1]).add(courses[0]); } else { List<Integer> temp = new ArrayList<Integer>(); temp.add(courses[0]); map.put(courses[1], temp); } } for (int i = 0; i < numCourses; i++) { if (!dfs(map, visited, i)) { return false; } } return true; } private boolean dfs(Map<Integer, List<Integer>> map, int[] visited, int i) { if (visited[i] == -1) {//剪枝 return false; } if (visited[i] == 1) {//剪枝 return true; } //visited[i] 默认为 0, 表示尚未访问,且不清楚是否有Cycle。 visited[i] = -1;//正在访问 if (map.containsKey(i)) { for (int v : map.get(i)) { if (!dfs(map, visited, v)) { return false; } } } visited[i] = 1;//访问结束,且不出现Cycle return true; } }
BFS without HashMap
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if (prerequisites == null) {
return false;
}
int length = prerequisites.length;
if (numCourses == 0 || length == 0) {
return true;
}
int[] preCount = new int[numCourses];
for (int i = 0; i < length; i++) {
preCount[prerequisites[i][0]]++;
}
Queue<Integer> q = new LinkedList<Integer>();
for (int i = 0; i < numCourses; i++) {
if (preCount[i] == 0) {
q.offer(i);
}
}
int numNoPre = q.size();
while (!q.isEmpty()) {
int course = q.poll();
for (int i = 0; i < length; i++) {
if (prerequisites[i][1] == course) {
preCount[prerequisites[i][0]]--;
if (preCount[prerequisites[i][0]] == 0) {
numNoPre++;
q.offer(prerequisites[i][0]);
}
}
}
}
return numNoPre == numCourses;
}
}BFS with HashMap
public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { if (prerequisites == null) { return false; } int length = prerequisites.length; if (numCourses == 0 || length == 0) { return true; } Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>(); for (int[] courses : prerequisites) { if (map.containsKey(courses[1])) { map.get(courses[1]).add(courses[0]); } else { List<Integer> temp = new ArrayList<Integer>(); temp.add(courses[0]); map.put(courses[1], temp); } } int[] preCount = new int[numCourses]; for (int i = 0; i < length; i++) { preCount[prerequisites[i][0]]++; } Queue<Integer> q = new LinkedList<Integer>(); for (int i = 0; i < numCourses; i++) { if (preCount[i] == 0) { q.offer(i); } } int numNoPre = q.size(); while (!q.isEmpty()) { int course = q.poll(); List<Integer> list = map.get(course); if (list == null) {//最后一门课程,没有后续课程 continue; } for (int i : list) { preCount[i]--; if (preCount[i] == 0) { numNoPre++; q.offer(i); } } } return numNoPre == numCourses; } }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- Purpose of the MacroMobile Project 1029 ------- No deletion of any Doc for the project
- String.Empty,NULL和""的区别
- C++算法--图算法读书笔记1
- FusionCharts中文乱码问题
- POJ1523 SPF dfs
- [convex hall] ZOJ 1518 This Sentence is False
- GraphData之 Bridge 计算
- 搜索专题