文章目录
- 拓扑排序
- 课程表
拓扑排序
算法原理:
1.先找出图中入度为0的点,将该点加入到队列中
2.队列不为空时,拿出队头元素加入到最终结果
3.再遍历该点的邻接阵,将连接该点的点的入度全部减减
4.判断减减的点是否为入度为0,为0就加入队列继续操作
5.最后判断所有点的入度是否有不为0的,有就代表里面存在环
课程表
思路:创建一个邻接表,统计边,创建数组in,里面存放的是该点的入度数,先遍历遍历数组,将数放入邻接表,并且统计入度数,遍历数组找到为0的放入队列,当队列不为空取队头元素,删除与队头元素相连的边,入度数减减,如果入度数为0存入队列重复操作。直到循环结束,判断是否有入度数不为0的点,有的话代表有环,返回false,没有的话返回true。
代码实现:
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
unordered_map<int,vector<int>> edges;
vector<int> in(numCourses);
for(auto& e:prerequisites)
{
int a=e[0],b=e[1];
edges[b].push_back(a);
in[a]++;
}
queue<int> q;
for(int i=0;i<numCourses;i++)
{
if(in[i]==0)
q.push(i);
}
while(!q.empty())
{
int t=q.front();
q.pop();
for(auto& e:edges[t])
{
in[e]--;
if(in[e]==0) q.push(e);
}
}
for(int i=0;i<numCourses;i++)
{
if(in[i]) return false;
}
return true;
}
};