课程表

问题描述 :
你必须选修 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。这是不可能的。

可使用以下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=canFinish(numCourses,prerequisites);
    cout<<(res?"true":"false")<<endl;
    return 0;
}

提示:
输入的先决条件是由边组成,每条边包含两个元素,比如[1,0],表示学习课程 1 之前,需要先完成课程 0
你可以假定输入的先决条件中没有重复的边。

输入说明 :
首先输入numCourses和先决条件的数目m
然后输入m行,每行两个整数,表示先决条件中的两门课程编号。
1 <= numCourses <= 2000

输出说明 :
输出true或false

输入范例 :
2 2
1 0
0 1

输出范例 :
false

bool canFinish(int numCourses, vector<vector<int>>& prerequisites){
 	vector<vector<int>> edges(numCourses);
 	vector<int> indge(numCourses,0);
 	for(int i=0;i<prerequisites.size();i++){
 		edges[prerequisites[i][1]].push_back(prerequisites[i][0]);//建立图的邻接表 
 		indge[prerequisites[i][0]]++;//入度++ 
	 }
	 queue<int> q;
	 for(int i=0;i<numCourses;i++){
	 	if(indge[i]==0){//入度为零的全部入队 
	 		q.push(i);
		 }
	 }
	 while(!q.empty()){
	 	int u=q.front();
	 	q.pop();
	 	for(int i=0;i<edges[u].size();i++){
	 		--indge[edges[u][i]];
	 		if(indge[edges[u][i]]==0){
	 			q.push(edges[u][i]);
			 }
		 }
	 }
	 for(int i=0;i<numCourses;i++){
	 	if(indge[i]!=0){//判断所有结点的入度是否全为零 
	 		return false;
		 }
	 }
	 return true;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值