「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。
拓扑排序
AOV网的定义
AOV网(顶点表示活动的网):在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系
AOV网(activity on vertex network)
拓扑序列的定义
拓扑序列:设有向图G=(V,E)具有 n 个顶点,则顶点序列 v0, v1, …, vn-1 称为一个拓扑序列,当且仅当满足下列条件:若从顶点 vi到 vj 有一条路径,则在顶点序列中顶点 vi 必在顶点 vj 之前
拓扑排序:对一个有向图构造拓扑序列的过程
拓扑排序算法——基本思想
算法:拓扑排序TopSort
输入:AOV网 G=(V,E)
输出:拓扑序列
1. 重复下述操作,直到输出全部顶点,或AOV网中不存在没有前驱的顶点
1.1 从AOV网中选择一个没有前驱的顶点并且输出;
1.2 从AOV网中删去该顶点,并且删去所有以该顶点为尾的弧;
图采用什么存储结构呢?
邻接表
拓扑排序算法——伪代码
算法:TopSort
输入:有向图G=(V,E)
输出:拓扑序列
1. 栈 S 初始化;累加器 count 初始化;
2. 扫描顶点表,将入度为 0 的顶点压栈;
3. 当栈 S 非空时循环
3.1 j = 栈顶元素出栈;输出顶点 j;count++;
3.2 对顶点 j 的每一个邻接点 k 执行下述操作:
3.2.1 将顶点 k 的入度减 1;
3.2.2 如果顶点 k 的入度为 0,则将顶点 k 入栈;
4. if (count<vertexNum) 输出有回路信息;
void TopSort(ALGraph *G)
{
int i, j, k, count = 0, S[MaxSize], top = -1;
EdgeNode *p = NULL;
//扫描顶点表
for (i = 0; i < G->vertexNum; i++)
if (G->adjlist[i].in == 0) S[++top] = i;
//当栈中还有入度为0的顶点时
while (top != -1 )
{
j = S[top--]; printf("%c ", G->adjlist[j].vertex); count++;
p = G->adjlist[j].first;
//描顶点表,找出顶点j的所有出边
while (p != NULL)
{
k = p->adjvex; G->adjlist[k].in--;
//将入度为0的顶点入栈
if (G->adjlist[k].in == 0) S[++top] = k;
p = p->next;
}
if (count < G->vertexNum ) printf("有回路");
}