71課程表(207)
作者:
晚於: 2020-08-26 12:00:00後提交分數乘係數50%
截止日期: 2020-09-02 12:00:00
問題描述 :
你必須選修 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;
}
輸入說明 :
首先輸入numCourses和先決條件的數目m
然後輸入m行,每行兩個整數,表示先決條件中的兩門課程編號。
1 <= numCourses <= 2000
輸出說明 :
輸出true或false
輸入範例 :
輸出範例 :
#include <iostream> #include <vector> #include <queue> using namespace std; class Solution { private: vector<vector<int>> edges; vector<int> indegree;//儲存每個點的入度 public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { edges.resize(numCourses) ; indegree.resize(numCourses); for(const auto &t:prerequisites) { edges[t[1]].push_back(t[0]); ++indegree[t[0]]; } queue<int> Q; for(int i=0;i<numCourses;i++) if(indegree[i]==0) Q.push(i);//先將所有入度為0的頂點存入佇列 int visited=0; while(!Q.empty()) { ++visited;//訪問出所有入度為0的點 int temp=Q.front(); Q.pop(); for(int u:edges[temp]) { --indegree[u]; if(indegree[u]==0) Q.push(u); } } return visited==numCourses;//如果能夠全部訪問出所有頂點,證明無環 } }; 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; }