1. 程式人生 > 實用技巧 >71課程表(207)

71課程表(207)

作者: Turbo時間限制: 1S章節: 深度優先搜尋

晚於: 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;
}