一、拓扑排序
定义: 拓扑排序是将一个有向无环图的所有顶点排成一个线性队列,并且保证队中的所有点不会指向其前面的点,即所有边只能是某个点指向其队列后面的点。
排序原理: 首先存下所有点的入度(有几条边的终点是该点),若某点入度为0,将该点加入拓扑序,然后删除该点为起点的所有边(就是将所有该点为起点的边的终点的入度减一),然后重复此操作,直到所有顶点进入拓扑序即可。若有点未进入拓扑序,说明该图存在环。
二、代码实现
1、邻接矩阵的拓扑排序
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N = 110;
int n,m; //顶点数和边数
int e[N][N],d[N]; //e为邻接矩阵数组,d为顶点入度数组
vector<int> ans; //ans为拓扑序数组即为最终答案
queue<int> q; //队列q存入度为0的点
void topsort()
{
for(int i = 1;i <= n;i++) //找出初始所有入度为0的点
if(d[i] == 0)
q.push(i); //入队q
while(!q.empty())
{
int t = q.front(); //记录队首顶点,处理以他为起点的边
q.pop();
ans.push_back(t); //q的队首进入拓扑序
for(int j = 1;j <= n;j++) //遍历其他所有点
{
if(e[t][j] == 1) //若存在以他为起点的边
{
d[j]--; //删除此边,其终点的入度-1
if(d[j] == 0) //如果终点的入度为0,入队
q.push(j);
}
}
}
}
int main()