

声明:以下知识相关资料来自比特官网和小编手搓~
有向无环图的概念:
顾名思义,首先就是一个有向图,其次就是这个有向图里面不存在回路(环)。

AOV网的概念:
就类似于一门系统课,他课程的设计肯定是合理的,有简单到难,知识深度层层递进的,每一门课程都有优先级,学完他,在学她。

在这种有向图中,用顶点表示活动,用有向边<Vi, Vj>表示活动Vi必须先于活动Vj举办,这种有向图叫做顶点表示活动的网络,简称AOV网(Activity On Vertex Network)。

AOV网中不能有回路,不然就不能确定哪一个活动先举行了。因此,AOV网必须是一个有向无环图。
拓扑排序的代码原理&作用:
拓扑排序的实现是借助于对列用bfs实现的,同时对于每个顶点都会记录此时有多少指向他的边,即记录该顶点的入度 in[N]。
此时提供一波小连招:
1、先把入度为0的顶点扔进对列
2、拿出队首元素,删除连带的边—>让被指的顶点的入度减1,就是代表这边对于这一个被指的顶点删除了。
3、此时会产生新的入度为0的顶点,把他们扔进对列
4、重复2、3,直至图中没有顶点或没有入度为0的顶点了
拓扑排序可以判断图中有没有环:
跑一遍拓扑排序算法,如果有顶点没有进队列,那么就代表有环。(环的入度不可能为0,进不来队列)

OJ题来源:洛谷
OJ题名:【模板】拓扑排序/家谱树
OJ题归属:图论基础【拓扑排序】
解题算法:拓扑排序
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N = 110;
int n;
vector<int> a[N]; // 存图 — 孩子表示法
int in[N]; // 存入度
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
int x;
while (cin >> x, x)
{
a[i].push_back(x);
// 是 i 的孩子,肯定会被他的边指,入度加一
in[x]++;
}
}
queue<int> q;
// 找出入度为0的入队
for (int i = 1; i <= n; i++)
{
if (in[i] == 0) q.push(i);
}
while (q.size())
{
int p = q.front(); q.pop();
cout << p << " ";
// 遍历p的孩子
for (auto& e : a[p])
{
// 删边
in[e]–;
// 把此时入度为0的顶点入队
if (in[e] == 0) q.push(e);
}
}
return 0;
}


