一、注意事项:
(1)每张图的拓扑序列可能不唯一(每个时刻入度为0的点的数量大于1)
(2)既可以用邻接表,也可以用邻接矩阵
(3)有环的图它的加入队列的点数一定小于总点数,所以可以通过这点来判断一张图有没有环(即有没有拓扑序)
二、基本步骤:
(1)每次把入度为0的点加入队列
(2)若队列不为空,每次取出队首数据,存放到一个数组中
(3)最后比较个数是否与总共的点数相同,来判断是否有拓扑序
三、模板代码:
例题: AcWing 848. 有向图的拓扑序列 - AcWing(已做笔记)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N=10010;
int n,m;
int in[N];
int h[N],e[N],ne[N],idx;
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int main()
{
cin >> n >> m;
memset(h,-1,sizeof(h));
while(m--){
int a,b;
cin >> a >> b;
in[b]++;
add(a,b);
}
queue<int> q;
int cnt=0;//用于统计点的个数
for(int i=1;i<=n;i++){
if(in[i]==0){
q.push(i);
cnt++;
}
}
int res[N],sum=0;//用于储存队列中的数据
while(!q.empty()){
int t=q.front();
res[sum++]=t;
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
in[j]--;
if(in[j]==0){
q.push(j);
cnt++;
}
}
q.pop();
}
//cout << cnt << endl;
if(cnt==n) for(int i=0;i<sum;i++) cout << res[i] << " ";
else cout << -1;
return 0;
}