Note:
有向图的拓扑排序
首先根据边的关系去构建一个邻接表,记录每个节点指向的下一个节点,同时统计每个节点的入度
维护一个队列,存放的是入度为0的点
每次弹出一个,把这个点指向的边删除,同时也就删除了好多入度,这时候如果删完之后入度为0了,就放入队列中,最后如果走完之后,队列中出去的数和点的数量一样,就说明全部排序了,没有环,否则就是又环,没办法拓扑排序
代码如下:
class Solution {
public:
bool canFinish(int n, vector<vector<int>>& edges) {
vector<vector<int>> g(n);
vector<int> d(n);
for(auto e : edges){
int a = e[1], b = e[0];
g[a].push_back(b);
d[b] ++;
}
vector<int> q;
int f = 0, e = 0;
for(int i = 0; i < n; i ++){
if(d[i] == 0)
q.push_back(i), e ++;
}
while(f < e){
auto node = q[f ++];
for(auto a : g[node])
if(-- d[a] == 0)
q.push_back(a), e ++;
}
return q.size() == n;
}
};