[LeetCode] Course schedule II

题目

题目描述

分析

其实这题是不准备做的,但是由于其中考试有一题和这个很像,那题有点问题,所以就做一个类似的来看看自己是不是真的有什么没考虑到的。这题是一个很明显的拓扑排序,我用的是BFS实现。这题的思路很明显,就是不断地找到入度为0的,并且将它指向的节点的入度都减一,知道最后没有点的入度为0。但是要注意的就是边的指向问题。另外,还有一个特例,就是如果图中有环,之间返回一个空的vector,而不是已经排序的部分。

时间复杂度分析

时间复杂度是O(V+E),需要遍历所有点和边

代码

class Solution
{
  public:
    struct vex {
        int index;
        int indegree;
        vector<int> to;
        vex(int _index, int _indegree = 0) : index(_index), indegree(_indegree) {}
    };
    vector<int> findOrder(int n, vector<pair<int, int> > &edges) {
        vector<int> ans;
        queue<int> q;
        vector<vex> vertex;
        if (n == 0) return ans;
        for (int i = 0; i < n; i++) {
            vertex.push_back(vex(i));
        }
        for (int i = 0; i < edges.size(); i++) {
            (vertex[edges[i].second].to).push_back(edges[i].first);
            (vertex[edges[i].first].indegree)++;
        }
        for (int i = 0; i < n; i++) {
            if (vertex[i].indegree == 0) q.push(i);
        }
        int index, pos;
        while (!q.empty()) {
            index = q.front();
            q.pop();
            ans.push_back(index);
            for (int i = 0; i < (vertex[index].to).size(); i++) {
                pos = (vertex[index].to)[i];
                if (--(vertex[pos].indegree) == 0) q.push(pos);
            }
        }
        for (int i = 0; i < n; i++) {
            if (vertex[i].indegree >0) return vector<int>();
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34035179/article/details/78515013