算法分析与设计丨第六周丨LeetCode(9)——Course Schedule(Medium)
2017-10-10 16:48
495 查看
拓扑排序
题目链接:https://leetcode.com/problems/course-schedule/description/
上周国庆休息,这周继续作业。
这题用到了拓扑排序,都是以前数据结构说到的方法,看来得把书拿出来翻一翻了。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> indegree(numCourses,0);//用来存储入度
vector<vector<int>> graph(numCourses,vector<int>(0));//用来存储每个结点指向哪些结点
for(auto i : prerequisites)//auto很好用
{
graph[i.second].push_back(i.first);//注意顺序,是后面的结点指向前面的结点
indegree[i.first]++;//pair是用first和second
}
queue<int> my_que;//用来放入度为零的点,表示没有其他点指着它了
for(int i = 0;i < numCourses;++i)
{
if(indegree[i] == 0)
my_que.push(i);
}
while(!my_que.empty())
{
int temp = my_que.front();
my_que.pop();
for(auto i : graph[temp])
{
--indegree[i];
if(indegree[i] == 0)//每当一个点的入度减为零,就放进队列
my_que.push(i);
}
}
for(int i = 0;i < numCourses;++i)
{
if(indegree[i] != 0)/还有入度不为零的就说明有环存在
return false;
}
return true;
}
};
题目链接:https://leetcode.com/problems/course-schedule/description/
上周国庆休息,这周继续作业。
这题用到了拓扑排序,都是以前数据结构说到的方法,看来得把书拿出来翻一翻了。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> indegree(numCourses,0);//用来存储入度
vector<vector<int>> graph(numCourses,vector<int>(0));//用来存储每个结点指向哪些结点
for(auto i : prerequisites)//auto很好用
{
graph[i.second].push_back(i.first);//注意顺序,是后面的结点指向前面的结点
indegree[i.first]++;//pair是用first和second
}
queue<int> my_que;//用来放入度为零的点,表示没有其他点指着它了
for(int i = 0;i < numCourses;++i)
{
if(indegree[i] == 0)
my_que.push(i);
}
while(!my_que.empty())
{
int temp = my_que.front();
my_que.pop();
for(auto i : graph[temp])
{
--indegree[i];
if(indegree[i] == 0)//每当一个点的入度减为零,就放进队列
my_que.push(i);
}
}
for(int i = 0;i < numCourses;++i)
{
if(indegree[i] != 0)/还有入度不为零的就说明有环存在
return false;
}
return true;
}
};
相关文章推荐
- 算法分析与设计丨第十四周丨LeetCode(18)——Maximum Subarray(Medium)
- 算法分析与设计丨第三周丨LeetCode(6)——Find Largest Value in Each Tree Row(Medium)
- 算法分析与设计丨第一周丨LeetCode(2)——Different Ways to Add Parentheses(Medium)
- 算法分析与设计丨第六周丨LeetCode(10)——Best Time to Buy and Sell Stock(Easy)
- 算法分析与设计丨第十三周丨LeetCode(17)——Coin Change(Medium)
- 算法分析与设计丨第十周丨LeetCode(14)——Edit distance(Hard)
- 算法分析与设计丨第三周丨LeetCode(5)——Median of Two Sorted Arrays(Hard)
- 算法分析与设计丨第一周丨 LeetCode(1)——Two Sum
- 算法分析与设计丨第十八周丨LeetCode(21)——Binary Tree Maximum Path Sum(Hard)
- 算法分析与设计丨第二周丨LeetCode(4)——Maximum Subarray(Easy)
- 算法分析与设计——leetcode刷题之Add Two Numbers(Medium)
- 算法分析与设计——LeetCode:4. Median of Two Sorted Arrays
- [算法分析与设计] leetcode 每周一题: Validate Binary Search Tree
- 算法分析与设计课程(7):【leetcode】Reverse Nodes in k-Group
- 算法分析与设计——LeetCode:33. Search in Rotated Sorted Array
- 算法分析与设计课程(4):【leetcode】Wildcard Matching
- 算法分析与设计——LeetCode Problem.64 Minimum Path Sum
- [算法分析与设计] leetcode 每周一题: 328. Odd Even Linked List
- 算法分析与设计课程——LeetCode刷题之4Sum
- [算法分析与设计] leetcode 每周一题: 135. Candy