您的位置:首页 > 其它

[LeetCode] Course schedule II

2017-11-12 20:54 507 查看

题目



分析

其实这题是不准备做的,但是由于其中考试有一题和这个很像,那题有点问题,所以就做一个类似的来看看自己是不是真的有什么没考虑到的。这题是一个很明显的拓扑排序,我用的是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
9c2f
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: