您的位置:首页 > 其它

【LeetCode】210. Course Schedule II (Medium)

2016-09-22 22:48 323 查看
【题意】给出一个有向图的边集,输出拓扑排序

【解】根据边集建图,用DFS,找出每个节点的发现时间和完成时间,按完成时间从大到小输出

写的时候把有向边方向写反了。。。

class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
init(numCourses, prerequisites);
int n = 0;
for (int i = 0; i < numCourses; i++)
{
if (!visited[i])
{
visited[i] = true;
pre[i] = n;
n++;
dfs(n, numCourses, i);
}
}
if (!find)
result.resize(0);
return result;
}
private:
vector<vector<int>> graph;
vector<bool> visited;
vector<int> pre;
vector<int> post;
vector<int> result;
stack<int> temp;
bool find;
void init(int numCourses, vector<pair<int, int>>& edges)
{
find = true;
graph.resize(numCourses);
int n = edges.size();
for (int i = 0; i < n; i++)
graph[edges[i].first].push_back(edges[i].second);
visited.resize(numCourses);
for (int i = 0; i < numCourses; i++)
visited[i] = false;
pre.resize(numCourses);
for (int i = 0; i < numCourses; i++)
pre[i] = -1;
post.resize(numCourses);
for (int i = 0; i < numCourses; i++)
post[i] = -1;
}
void dfs(int& cur, int n, int start)
{
for (size_t i = 0; i < graph[start].size(); i++)
{
if (!visited[graph[start][i]])
{
visited[graph[start][i]] = true;
pre[graph[start][i]] = cur;
cur++;
dfs(cur, n, graph[start][i]);
}
else //判断是不是DAG
{
if (pre[graph[start][i]] < pre[start] && post[graph[start][i]] == -1)
find = false;
}
}
post[start] = cur;
cur++;
result.push_back(start); //图建反了,push_back就可以了。。。
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: