leetcode@ [207] Course Schedule

 1 struct edge{
 2     int to,cost;
 3     edge(){ this->to = 0; this->cost = 0;}
 4     edge(int t){ this->to = t; this->cost = 0;}
 5 };
 6 class Solution {
 7 public:
 8     void addEdge(vector<edge> &edgelist, vector<vector<int>> &G, int from, int to){
 9         edge e = edge(to);
10         edgelist.push_back(e);
11         G[from].push_back(edgelist.size()-1);
12     }
13     bool isCyclic(vector<edge> &edgelist, vector<vector<int>> &G, vector<bool> vis, vector<bool> recStack, int v){
14         for(int i=0;i<G[v].size();++i){
15             edge e = edgelist[G[v][i]];
16             if(recStack[e.to]) return false; // has cycle
17             if(!vis[e.to]){
18                 vis[e.to] = true; recStack[e.to] = true;
19                 if(!isCyclic(edgelist, G, vis, recStack, e.to)) return false; // has cycle
20                 recStack[e.to] = false;
21             }
22         }
23         return true;
24     }
25     bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
26         vector<edge> edgelist; edgelist.clear();
27         vector<vector<int> > G(numCourses);
28         for(int i=0;i<G.size();++i) G[i].clear();
29         
30         for(int i=0;i<prerequisites.size();++i){
31             pair<int, int> pr = prerequisites[i];
32             addEdge(edgelist, G, pr.first, pr.second);
33         } 
34         
35         vector<bool> vis(numCourses);
36         vector<bool> recStack(numCourses);
37         for(int i=0;i<numCourses;++i){
38             if(!vis[i]){
39                 vis[i] = true; recStack[i] = true;
40                 if(!isCyclic(edgelist, G, vis, recStack, i)) return false; // has cycle
41                 recStack[i] = false;
42             }
43         }
44         
45         return true;
46     }
47 };

 

posted @ 2015-10-23 19:15  流白  阅读(151)  评论(0编辑  收藏  举报