LeetCode Course Schedule BFS

来源:互联网 发布:html小游戏源码 编辑:程序博客网 时间:2024/06/05 18:33

思路:

BFS + 拓扑排序

Status:MLE
Reason:用二维数组 vector<vector<int>> 存图信息,有太多没用的信息0,占用了很大空间。
看了DISCUSS后的优化:
vector<unordered_set<int>> 存图信息,表示为每个节点对应连接到哪些节点。

class Solution {public:    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {        vector<int> inDegree(numCourses, 0);        vector<vector<int>> graph(numCourses, vector<int>(numCourses, 0));        queue<int> q;        for(int i = 0; i < numCourses; ++i) {            if(inDegree[i] == 0) q.push(i);        }        while(!q.empty()) {            int start_node_id = q.front();            q.pop();            for(int i = 0; i < numCourses; ++i) {                if(graph[start_node_id][i] == 1) {                    inDegree[i]--;                    if(inDegree[i] == 0) {                        q.push(i);                    }                }            }        }        for(int i = 0; i < numCourses; ++i) {            if(inDegree[i] != 0) {                return false;            }        }        return true;    }};

Staus:AC

class Solution {public:    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {        vector<unordered_set<int>> need(numCourses);        for (size_t i = 0; i != prerequisites.size(); ++i)            need[prerequisites[i].second].insert(prerequisites[i].first);        vector<int> indegree(numCourses);        for (int i = 0; i != numCourses; ++i)            for(auto it = need[i].begin(); it != need[i].end(); ++it)                ++indegree[*it];        queue<int> zeros;        for (int i = 0; i != numCourses; ++i)            if (indegree[i] == 0)                zeros.push(i);        while (!zeros.empty()) {            int seq = zeros.front();            zeros.pop();            for (auto it = need[seq].begin(); it != need[seq].end(); ++it)                if (--indegree[*it] == 0)                    zeros.push(*it);            --numCourses;        }        return numCourses == 0;    }};
0 0
原创粉丝点击