5.3 DAG图的相关使用
DAG(Direct Acyclic Grpah)
应用:有向无环图——>描述表达式——注意可以减少重复变量,精简生成树
5.4 拓扑排序相关使用
AOV网(Activity On Vertex NetWork)顶点表示活动的网
DAG图,有向无环图——>AOV网,用顶点表示活动的网(更真实的系统),图表示更抽象的数学系统
时间复杂度:O(V+E)遍历顶点集和边集,用邻接表的结构存储图
排序方法:
从AOV网选取一个没有前驱的顶点并输出,
删除该顶点和它为起点的有向边,
一直重复
1.拓扑排序结构体
弧针对于有向图
相关的细节理解不清楚
#define MaxVertexNum 100 //顶点数Vertex
typedef struct ArcNode{//边表节点
int adjvex;//弧指向顶点的位置,应该是入度位置
struct ArcNode *nextarc;//指向下一条弧的指针
//InfoType info; //网的边权值
}ArcNode;
typedef struct VNode{//顶点表结点
VertexType data;//顶点信息
ArcNode *firsrarc;//指向第一条依附该顶点的弧的指针
}VNode,AdjLisit[MaxVertexNum];
//图的信息表
typedef struct{
AdjList vertices;//省略邻接表的结构体定义
int vexnum,arcnum; //图的顶点数与弧数
}Graph;
2.拓扑排序方法体
//拓扑排序
bool TopologicalSort(Graph G)
{
InitStack(S); //初始化栈
for (int i = 0; i < G.vexnum; i++)
{
if (indegree[i] == 0) //记录顶点的入度
Push(S, i);
}
int count = 0;
while (!IsEmpty(S))
{
Pop(S, i);
print[count++] = i; //记录顶点的拓扑序列
for (p = G.vertices[i].firstarc; p; p = p->nextarc)
{
//将所有i指向的顶点入度减1,并将入度减少为0的顶点压入栈S
v = p->adjvex;
if (!(--indegree[v]))
Push(S, v);
}
}
if (count < G.vexnum) //判断拓扑排序是否成功
return false;
else
return true;
}
3.DFS实现拓扑与逆拓扑排序
5.5AOE网在关键路径中的使用(Activity On Edge NetWork)
DAG——>AOV——>AOE
DAG图 (描述表达式,减少重复)
有向无环图
AOV网 (顶点表示活动,拓扑排序)
顶点表示活动网
AOE网(顶点表示事件,边表示活动图,关键路径)
顶点表示事件,边表示活动图,边上权值表示开销,用边表示活动的网络
特征:
源点,汇点,关键路径,关键活动
求解关键路径步骤
1.拓扑排序,事件最早发生时间 ve()
2.逆拓扑排序,事件最迟发生时间 vl()
3.e()活动最早发生时间 ,借助 ve()
4.l()活动最迟发生时间 ,借助el()
5.所有活动的时间余量 d()