LC.207.课程表(拓扑排序)

LC.207.课程表(拓扑排序)

思路:拓扑排序。

1. d f s dfs 解法:

class Solution {
public:
    vector<vector<int> >e;
    vector<int>vis;//(0:未搜的点 1:正在搜的点 2:已经搜完的点)
    bool ok;
    void dfs(int u){
        vis[u]=1;
        for(int v:e[u]){
            if(!vis[v]){
                dfs(v);
                if(!ok) return;
            }
            else if(vis[v]==1){
                ok=0;
                return;
            }
        }
        vis[u]=2;
    }
    bool canFinish(int num, vector<vector<int>>& p) {
        vis.resize(num),e.resize(num);
        for(auto i:p){
            int x=i[0],y=i[1];
            e[y].push_back(x);
        }
        ok=1;
        for(int i=0;i<num&&ok;i++)  if(!vis[i]) dfs(i);
        return ok;
    }
};

b f s bfs 解法:

class Solution {
public:
    int d[100005];
    vector<int>e[100005];
    bool bfs(int num, vector<vector<int>>& p){
        int cnt=0;
        queue<int>q;
        for(int i=0;i<num;i++) if(!d[i]) q.push(i);
        while(!q.empty()){
            int u=q.front();q.pop();
            cnt++;
            for(int v:e[u]){
                 if(--d[v]==0) q.push(v);
            }
        }
        return cnt==num;
    }
    bool canFinish(int num, vector<vector<int>>& p) {
          for(auto i:p){
              int x=i[0],y=i[1];
              e[y].push_back(x);
              d[x]++;
          }
          return bfs(num,p);
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107778456