LeetCode_207课程表(拓扑排序)

题目链接:https://leetcode-cn.com/problems/course-schedule/description/

拓扑排序详解:https://blog.csdn.net/Q_M_X_D_D_/article/details/84862081

        本题大意是给一个图,判断图中是否有环路。用bfs的思想来进行拓扑排序。基本思路是统计图中所有点的出度,然后动态维护一个入度为0的顶点的队列,遍历队列中的每个点,去掉图中从该点出发的边,同时将该边的终点的入度-1,若终点的入度为0则加入队列。当队列为空时判断图中是否还有边。代码如下:

class Solution {
public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
    	int res=prerequisites.size();
    	queue<int> q;
    	vector<int> in(numCourses,0);
    	//统计每个点的入度 
    	for(int i=0;i<prerequisites.size();i++)
    		in[prerequisites[i].first]++;
    	//将入度为0的点入队 
		for(int i=0;i<in.size();i++)
			if(in[i]==0)
				q.push(i);
		while(!q.empty())
		{
			//取出一个点,bfs的思想体现在这里 
			int s=q.front();
			q.pop();
			//去掉以该点为起点的边 
			for(int i=0;i<prerequisites.size();i++)
			{
				if(prerequisites[i].second==s)
				{
					res--;//res--表示去掉了这条边
					//终点的入度-1 
					if(--in[prerequisites[i].first]==0)
						q.push(prerequisites[i].first);
				}
			}
		}
		return res==0;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值