一、知识点
二、例题
1、AcWing 848. 有向图的拓扑序列
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 1e5+10;
int n, m, indegree[N] = {0}; //indegree[i]表示顶点i的入度
vector<int> Adj[N]; //使用邻接表来存储有向图
vector<int> path;
bool TopologicalSort(){
queue<int> q;
for (int i = 1; i <= n; i++){//将所有入度为0的结点入队
if (!indegree[i]) q.push(i);
}
while(q.size()){
int u = q.front();
q.pop();
path.push_back(u); //存储拓扑排序的结果
for (int i = 0; i < Adj[u].size(); i++){
//将所有从u出发的有向边全部删除(和u相连的结点的入度--)
int v = Adj[u][i];
if (!(--indegree[v])) q.push(v);
}
}
return path.size() == n;
}
int main(){
cin>>n>>m;
while(m--){
int a, b;
cin>>a>>b;
Adj[a].push_back(b);
indegree[b]++;
}
if (TopologicalSort()){
for (int i : path) cout<<i<<" ";
}else
cout<<"-1";
return 0;
}
2、207. 课程表
class Solution {
private:
static const int N = 100010;
vector<int> Adj[N];
int indegree[N] = {0};
public:
bool canFinish(int n, vector<vector<int>>& prerequisites) {
for (vector<int> prerequisity : prerequisites){
int u = prerequisity[0], v = prerequisity[1];
Adj[v].push_back(u);
indegree[u]++;
}
queue<int> q;
for (int i = 0; i < n; i++){
if (!indegree[i]) q.push(i);
}
int cnt = 0;
while(q.size()){
int u = q.front();
q.pop();
cnt++;
for (int i = 0; i < Adj[u].size(); i++){
int v = Adj[u][i];
if (!(--indegree[v])) q.push(v);
}
}
return cnt == n;
}
};
3、210. 课程表 II
class Solution {
private:
static const int N = 100010;
vector<int> Adj[N];
int indegree[N] = {0};
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
for (vector<int> prerequisity : prerequisites){
int u = prerequisity[0], v = prerequisity[1];
Adj[v].push_back(u);
indegree[u]++;
}
queue<int> q;
for (int i = 0; i < numCourses; i++){
if (!indegree[i]) q.push(i);
}
vector<int> coures, empty;
while(q.size()){
int u = q.front();
q.pop();
coures.push_back(u);
for (int i = 0; i < Adj[u].size(); i++){
int v = Adj[u][i];
if (!(--indegree[v])) q.push(v);
}
}
return coures.size() == numCourses ? coures : empty;
}
};