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

本文介绍了如何利用拓扑排序解决LeetCode 207题,即判断有向图中是否存在环。通过维护一个包含入度为0的节点的队列,不断更新节点的入度,当队列为空且所有节点入度为0时,证明图中不存在环。
摘要由CSDN通过智能技术生成

求有向图中是否有环。


法一:拓扑排序

用一个队列维护所有入度为0的节点,每次弹出一个节点v,查看从v可达的所有节点u;

将u的入读减一,若u的入度此时为0, 则将u加入队列。

在队列为空时,检查所有节点的入度,若所有节点入度都为0, 则存在这样的一个拓扑排序 —— 有向图中不存在环。

代码:

class Solution
{
public:
	bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites)
	{
		vector<vector<bool>> map(numCourses, vector<bool>(numCourses, false));
		vector<int> in_degree(numCourses, 0);
		for_each(prerequisites.begin(), prerequisites.end(),
			[&map, &in_degree](pair<int,int> p)
			{
				if (map[p.first][p.second] == false)
				{
					map[p.first][p.second] = true;
					++ in_degree[p.second];
				}
			});
		queue<int> q;
		for (int id = 0; id < numCourses; ++ id)
		{
			if (in_degree[id] == 0)
			{
				q.push(id);
			}
		}
		while (!q.empty())
		{
			int course &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值