【LeetCode】210. Course Schedule II (Medium)
2016-09-22 22:48
323 查看
【题意】给出一个有向图的边集,输出拓扑排序
【解】根据边集建图,用DFS,找出每个节点的发现时间和完成时间,按完成时间从大到小输出
写的时候把有向边方向写反了。。。
【解】根据边集建图,用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就可以了。。。 } };
相关文章推荐
- Linux常用的操作指令
- Nginx 与 FPM 的工作机制
- 最长回文字符串
- mysql 分片
- windows禅道环境搭建
- C 数组模拟阶乘运算
- 这个应该是目前最全的Tracking相关的文章了
- 文章标题 HDU 5113 : Black And White (dfs+剪枝)
- 反射获取HashMap内部table字段及其node链表,打印全部数据
- 十四、Lua字符串库中的几个重要函数
- 第二次作业及总结——数据类型和运算符
- 获取linux下,tcp、udp的系统默认缓存大小和最大值
- 如何在CentOS 7上修改主机名
- UVA 12169
- http请求
- 如何提高测试效率
- 又见神奇的异或。Trie树。今日头条。
- 单片机项目:驱动VS1003模块(二)
- UE4 的 C++ 开发体验
- mysql性能优化-慢查询分析、优化索引和配置