拓扑排序
题目链接: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;
}
};