vector<int> topologicalSort(vector<pair<int, int>>& graph, int numV){
	vector<int> rslt;	
	vector<int> inDegree(numV, 0);
	unordered_map<int, vector<int>> adjList;
	unordered_set<int> visited;

	for(auto e:graph){
		inDegree[e.second]++;
		adjList[e.first].push_back(e.second);
	}

	for(int k = 0; k < numV; k++){
		int vertex = -1;
		for(int i = 0; i < inDegree.size(); i++)
			if(visited.find(i) == visited.end() && inDegree[i] == 0){
				vertex = i;
				break;
			}
		if(vertex == -1)
			cout << "The graph contains a circle." << endl;
		visited.insert(vertex);
		rslt.push_back(vertex);
		for(auto w:adjList[vertex])
			inDegree[w]--;
	}

	return rslt;
}
vector<int> topologicalSort(vector<pair<int, int>>& graph, int numV){
	vector<int> rslt;	
	vector<int> inDegree(numV, 0);
	unordered_map<int, vector<int>> adjList;
	queue<int> q;

	for(auto e:graph){
		inDegree[e.second]++;
		adjList[e.first].push_back(e.second);
	}

	int vertex = -1;
	for(int i = 0; i < inDegree.size(); i++)
		if(inDegree[i] == 0){
			vertex = i;
			break;
		}
	q.push(vertex);

	while(!q.empty()){		
		vertex = q.front();
		q.pop();
		rslt.push_back(vertex);
		for(auto w:adjList[vertex])
			if(--inDegree[w] == 0)
				q.push(w);
	}

	if(rslt.size() < numV)
		cout << "The graph contains a circle." << endl;

	return rslt;
}
示例#3
0
 bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
     Node node[numCourses];
     vector<int> inDegree(numCourses, 0);
     queue<int> que;
     int cnt = 0;
     for (auto par : prerequisites) {
         inDegree[par.first]++;
         node[par.second].next.push_back(par.first);
     }
     for (int i = 0; i < numCourses; ++i) {
         if (inDegree[i] == 0) {
             que.push(i);
             ++cnt;
         }
     }
     while (!que.empty()) {
         int iFront = que.front();
         que.pop();
         for (auto idx : node[iFront].next) {
             if (inDegree[idx] > 0)
                 --inDegree[idx];
             if (inDegree[idx] <= 0) {
                 que.push(idx);
                 ++cnt;
             }
         }
     }
     return cnt == numCourses;
 }
示例#4
0
 vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
     int n = prerequisites.size();
     vector<int> inDegree(numCourses, 0);
     for(int i = 0; i < n; i++) {
         inDegree[prerequisites[i].first]++;
     }
     
     queue<int> q;
     for(int i = 0; i < numCourses; i++) {
         if(inDegree[i] == 0) {
             q.push(i);
         }
     }
     
     vector<int> res;
     while(!q.empty()) {
         int c = q.front();
         q.pop();
         res.push_back(c);
         for(int i = 0; i < n; i++) {
             if(prerequisites[i].second == c) {
                 inDegree[prerequisites[i].first]--;
                 if(inDegree[prerequisites[i].first] == 0) {
                     q.push(prerequisites[i].first);
                 }
             }
         }
     }
     
     if(res.size() == numCourses) {
         return res;
     } else {
         return vector<int> {};
     }
 }
 vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
     vector<vector<int>> adjacentList(numCourses);
     vector<int> inDegree(numCourses);
     for (auto& p : prerequisites) {
         adjacentList[p.second].push_back(p.first);
         ++inDegree[p.first];
     }
    
     queue<int> q;
     for (int i = 0; i < numCourses; ++i) {
         if (inDegree[i] == 0) {
             q.push(i);
         }
     }
     vector<int> ret;
     while (!q.empty()) {
         int v = q.front();
         q.pop();
         ret.push_back(v);
         for (auto t : adjacentList[v]) {
             --inDegree[t];
             if (inDegree[t] == 0) {
                 q.push(t);
             }
         }
     }
     
     if (ret.size() < numCourses) {
         return vector<int>();
     } else {
         return ret;
     }
 }
 bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
     if (prerequisites.empty()) return true;
     // inDegree[i] = k means courses i has k prerequisites
     // courses without any prerequisites can be taken immedinately
     vector<int> inDegree(numCourses, 0);
     for (int i = 0; i < prerequisites.size(); i++) {
         inDegree[prerequisites[i].first]++;
     }
     queue<int> prereqCourses;
     int totalDegree = 0;
     for (int i = 0; i < numCourses; i++) {
         totalDegree += inDegree[i];
         if (inDegree[i] == 0) {
             prereqCourses.push(i);
         }
     }
     if (prereqCourses.empty()) return false;
     while (!prereqCourses.empty()) {
         int curCourse = prereqCourses.front();
         prereqCourses.pop();
         for (int i = 0; i < prerequisites.size(); i++) {
             if (prerequisites[i].second == curCourse) {
                 --totalDegree;
                 if (--inDegree[prerequisites[i].first] == 0) {
                     prereqCourses.push(prerequisites[i].first);
                 }
             }
         }
     }
     return totalDegree == 0;
 }
示例#7
0
 bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
   // lists store the edges
   // each list store the connected node. <- (to nodes)
   vector<vector<int>> graph(numCourses, vector<int>(0));
   vector<int> inDegree(numCourses, 0);
   for (auto& ele : prerequisites) {
     graph[ele.second].push_back(ele.first);
     inDegree[ele.first]++;
   }
   queue<int> que;
   for (int i = 0; i < numCourses; i++) {
     if (inDegree[i] == 0) {
       que.push(i);
     }
   }
   while (!que.empty()) {
     int cur = que.front();
     que.pop();
     for (auto ele : graph[cur]) {
       inDegree[ele]--;
       if (inDegree[ele] == 0) {
         que.push(ele);
       }
     }
   }
   // 如里最后还有入度不为0的节点的话,说明有环,否则无环。
   for (int i = 0; i < numCourses; i++) {
     if (inDegree[i] != 0) {
       return false;
     }
   }
   // we can also use the sort result's size() 
   // if it is less than numCourses, return true;
   return true; 
 }
示例#8
0
 vector<int> findOrder(int numCourses, vector<pair<int, int> >& prerequisites) {
     vector<vector<int> > graph(numCourses, vector<int>());
     vector<int> inDegree(numCourses, 0);
     for (auto i : prerequisites) {
         graph[i.second].push_back(i.first);
         ++inDegree[i.first];
     }
     queue<int> q;
     for (int i = 0; i < numCourses; ++i) {
         if (inDegree[i] == 0) {
             q.push(i);
         }
     }
     vector<int> res;
     while (!q.empty()) {
         int node = q.front();
         q.pop();
         res.push_back(node);
         for (auto i : graph[node]) {
             --inDegree[i];
             if (inDegree[i] == 0) {
                 q.push(i);
             }
         }
     }
     if (res.size() != numCourses) {
         res.clear();
     }
     return res;
 }
 vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
     vector<int> order;
     if (prerequisites.empty()) {
         for (int i = 0; i < numCourses; i++) {
             order.push_back(i);
         }
         return order;
     }
     // construct in-degree table
     vector<int> inDegree(numCourses, 0);
     for (int i = 0; i < prerequisites.size(); i++) {
         inDegree[prerequisites[i].first]++;
     }
     int totalDegree = 0;
     queue<int> prereqCourses;
     for (int i = 0; i < numCourses; i++) {
         totalDegree += inDegree[i];
         if (inDegree[i] == 0) {
             prereqCourses.push(i);
         }
     }
     if (prereqCourses.empty()) {
         return order;
     }
     while (!prereqCourses.empty()) {
         int curCourse = prereqCourses.front();
         order.push_back(curCourse);
         prereqCourses.pop();
         for (int i = 0; i < prerequisites.size(); i++) {
             if (prerequisites[i].second == curCourse) {
                 totalDegree--;
                 if (--inDegree[prerequisites[i].first] == 0) {
                     prereqCourses.push(prerequisites[i].first);
                 }
             }
         }
     }
     if (totalDegree != 0) {
         order.clear();
         return order;
     }
     return order;
 }
示例#10
0
	vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
		vector<int> vec;
		if (numCourses <= 0){
			return vec;
		}
		vector<set<int> > Graph(numCourses);
		for (int i = 0; i < prerequisites.size(); ++i){
			Graph[prerequisites[i].second].insert(prerequisites[i].first);
		}
		vector<int> inDegree(numCourses);
		for (int i = 0; i < Graph.size(); ++i){
			for (auto it = Graph[i].begin(); it != Graph[i].end();++it){
				inDegree[*it]++;
			}
		}
		queue<int> q1;
		for (int i = 0; i < inDegree.size(); ++i){
			if (!inDegree[i]){
				q1.push(i);
			}
		}
	
		while (!q1.empty()){
			int value = q1.front();
			vec.push_back(value);
			q1.pop();
			for (auto it = Graph[value].begin(); it != Graph[value].end(); ++it){
				if (!--inDegree[*it]){
					q1.push(*it);
				}
			}
		}
		for (int i = 0; i < numCourses; ++i){
			if (inDegree[i]){
				vec.clear();
				return vec;
			}
		}
		return vec;
	}
示例#11
0
 vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
     Node node[numCourses];
     vector<int> inDegree(numCourses, 0);
     vector<int> ans;
     int cnt = 0;
     
     for (auto pir : prerequisites) {
         ++inDegree[pir.first];
         node[pir.second].next.push_back(pir.first);
     }
     
     for (int i = 0; i < numCourses; ++i) {
         if (inDegree[i] == 0) {
             ++cnt;
             ans.push_back(i);
             dfs(node, inDegree, ans, cnt, i);
         }
     }
     
     if (cnt != numCourses) {
         ans.clear();
     }
     return ans;
 }