5.4图的综合应用——DAG,AOV,AOE

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()

你可能感兴趣的:(Alogrithm,数据结构)