码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)

时间:2015-08-03 01:12:08      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:leetcode   c++   topology sort   

LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似。


注意到,在for (auto p: prerequistites)中特判了输入中可能出现的平行边或自环。


代码:

class Solution 
{
public:
    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) 
    {
    	// [0, {1, 2, 3}], means after finishing #0, you "might" be able to take #1, #2, #3
    	// That is, you must finish #0, before trying to take #1, #2, #3
    	map<int, vector<int>> course_chain;
    	vector<int> in_degree(numCourses, 0);
    	queue<int> q;
    	vector<int> ret;

    	for (auto p: prerequisites)
    	{    
  			// self-loop, return empty vector.    			
    		if (p.first == p.second)
    		{
    			return vector<int>();
    		}
    		// no duplicate edges input
    		if (find(course_chain[p.second].begin(), course_chain[p.second].end(), p.first) == course_chain[p.second].end())
    		{
    			course_chain[p.second].push_back(p.first);
    			++ in_degree[p.first];
    		}
    	}
    	for (size_t i = 0; i < numCourses; ++ i)
    	{
    		if (in_degree[i] == 0)
    		{
    			q.push(i);
    		}
    	}
    	for (; !q.empty(); q.pop())
    	{
    		int pre_course = q.front();
    		ret.push_back(pre_course);
    		for (auto it = course_chain[pre_course].begin(); it != course_chain[pre_course].end(); ++ it)
    		{
    			-- in_degree[*it];
    			if (in_degree[*it] == 0)
    			{
    				q.push(*it);
    			}
    		}
    	}

    	return ret.size()==numCourses? ret: vector<int>();
    }
};


版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)

标签:leetcode   c++   topology sort   

原文地址:http://blog.csdn.net/stephen_wong/article/details/47223483

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!