拓扑图:
拓扑排序步骤:
1.建图并记录所有节点的入度。
2.将所有入度为0的节点加入队列。
3.取出队首的元素t,将其加入拓扑序列。
4.访问所有t的邻接点x,将x的入度减1,当减到0后,将x加入队列。
5.重复步骤3、4,直到队列为空。
6.如果拓扑序列个数等于节点数,代表该有向图无环,且存在拓扑序。
C++ 代码
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
if(prerequisites.size()<1) return true;
//建立邻接表graph,统计入度的数组d
vector<vector<int>> graph(numCourses);
int d[numCourses];
memset(d,0,sizeof d);
for (auto edge : prerequisites) {
graph[edge[1]].push_back(edge[0]);
d[edge[0]]++;
}
//建立一个队列,并将入度为0的点加入到队列中
int co=0,q[numCourses];
int hh=0,tt=-1;
for(int i=0;i<numCourses;i++)
{
if(d[i]==0) q[++tt]=i;
}
//如果该点的入度变为0,则把其加入到数组中去
while(hh<=tt)
{
int t=q[hh++];
co++;
for(auto x:graph[t])
{
d[x]--;
if(d[x]==0) q[++tt]=x;
}
}
return co == numCourses;
}
};