力扣练习——71 课程表

71 课程表

1.问题描述
你必须选修 numCourse 门课程,记为 0 到 numCourse-1 。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]

给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?

示例 1:

输入: 2, [[1,0]]

输出: true

解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

示例 2:

输入: 2, [[1,0],[0,1]]

输出: false

解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。

提示:

输入的先决条件是由边组成,每条边包含两个元素,比如[1,0],表示学习课程 1 之前,需要先完成课程 0

你可以假定输入的先决条件中没有重复的边。

可使用以下main函数:

int main()

{

vector<vector<int>> prerequisites;

int numCourses,m;

cin>>numCourses>>m;

int c1,c2;

int ch;

for(int i=0; i<m; i++)

{

    vector<int> aPrerequisite;

    cin>>c1>>c2;

    aPrerequisite.push_back(c1);

    aPrerequisite.push_back(c2);

    prerequisites.push_back(aPrerequisite);

}



bool res=Solution().canFinish(numCourses,prerequisites);

cout<<(res?"true":"false")<<endl;

return 0;

}
2.输入说明
首先输入numCourses和先决条件的数目m

然后输入m行,每行两个整数,表示先决条件中的两门课程编号。

1 <= numCourses <= 2000
3.输出说明
输出true或false
4.范例
输入
2 2
1 0
0 1
输出
false
5.代码

#include<iostream>
#include<map>
#include<string>
#include<unordered_map>
#include<algorithm>
#include<string.h>
#include<sstream>
#include <vector>
#include<queue>

using namespace std;


bool canFinish(int numCourses, vector<vector<int>> prerequisites)
{
	//拓扑排序,选择入度为0的节点【BFS】
	vector<int> Indegrees(numCourses);//记录每个点入度,注意这里要确定数组大小
	unordered_map<int, vector<int> >map;//记录依赖该节点的其他节点
	for (int i = 0; i < prerequisites.size(); i++)
	{
		Indegrees[prerequisites[i][0]]++;
		map[prerequisites[i][1]].push_back(prerequisites[i][0]);//记录依赖该节点的其他节点
	}

	queue <int>q;//BFS要用队列

	for (int i = 0; i < Indegrees.size(); i++)
	{
		if (Indegrees[i] == 0)//将所有入度为0的节点入队
			q.push(i);
	}
	int cnt = 0;//用来记录已经学过的课程数,判断是否等于课程总数即可
	while (q.size()>0)
	{
		int selected = q.front();//已经选择的课程下标
		q.pop();//出队
		cnt++;//选课数加一
		//在map中获取这门课程的依赖课程
		vector<int>deps = map[selected];
		//更新依赖课程的入度
		if (deps.size() > 0)
		{
			for (int i = 0; i < deps.size(); i++)
			{
                    Indegrees[deps[i]]--;
					if (Indegrees[deps[i]] == 0)//若入度减1后,该节点变成入度为0 ,入队
						q.push(deps[i]);
			}
		}
	}
	//在队列为空时,判断cnt是否等于总节点数
		return cnt == numCourses ? true : false;

}
int main()

{

	vector<vector<int>> prerequisites;

	int numCourses, m;

	cin >> numCourses >> m;

	int c1, c2;

	int ch;

	for (int i = 0; i < m; i++)

	{

		vector<int> aPrerequisite;

		cin >> c1 >> c2;

		aPrerequisite.push_back(c1);

		aPrerequisite.push_back(c2);

		prerequisites.push_back(aPrerequisite);

	}



	bool res = canFinish(numCourses, prerequisites);

	cout << (res ? "true" : "false") << endl;

	return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值