207.课程表!

本题是一道拓扑排序的问题,个人感觉难度还是挺大的,即便写出来也感觉有些似懂非懂。另外我个人认为本题并没有使用传统的拓扑排序,而是通过dfs来判断的图 有没有形成环路。

本题的技巧主要是

  1. 把二维数组转换成类似邻接表的图的表示方法
  2. 深度优先搜索dfs来判断从当前顶点出发有没有形成环路。这里需要借助flag数组来进行标记,flag有3种状态,-1表有环路,0是默认值代表还未处理,1代表无环路
  3. 遍历所有顶点,都没有形成环路,则返回true

代码:

class Solution {
public:
    bool canFinish(int numCourses, vector>& p) {
        if(p.size()==0)
            return true;
        int n=p.size();
        vector flag(numCourses,0);
        vector> tmp(numCourses,vector());
        for(int i=0;i &flag,vector> &tmp){
        if(flag[i]==-1)
            return false;
        if(flag[i]==1)
            return true;
        
        flag[i]=-1;
        int n=tmp[i].size();
        for(int j=0;j

预计用时10分钟,实际用时48分钟

你可能感兴趣的:(207.课程表!)