AOV网与拓扑排序

AOV网的定义

以顶点表示活动,以有向边表示活动之间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称AOV网

例如:计算机专业课学习流程

为保证流程可执行,AOV网中不应该出现回路。

拓扑排序

拓扑序列:设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,…,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之前

拓扑排序:构造拓扑序列的过程

拓扑排序方法

  1. 从AOV网中选择一个没有前驱的顶点,并输出;

  2. 从AOV网中去掉该顶点以及以该顶点为出发点的所有边;

  3. 重复上述过程,直到AOV网中的不存在入度为0的顶点。

判断有无回路

完成3后,如果AOV网中还有顶点,说明有回路;反之,说明所有顶点都被输出,即没有回路。

例如:(红圈表示当前删除顶点)

算法

存储结构——邻接表

typedef struct AOVedge{
    int adj;                //该边的终止顶点在顶点结点中的位置
    int weight;             //边的权值
    struct AOVedge *next;   //指向下一个边结点
}AELink;
typedef struct AOVver{
    int indegree;           //顶点的入度
    int vertex;             //顶点信息
    AELink *link;           //指向第一个边结点
}TOPOVLink;

代码实现

void TOPO_sort(TOPOVLink G[],int n,int V[])    //G[]为顶点结点数组,n为顶点个数,V[]为存放拓扑序列的数组
{
    AELink *p;
    int i,j,k,top=-1;
    for(i=0;i<n;i++)    //栈初始化:将原图入度为0的顶点进栈
    {
        if(G[i].indegree==0)
        {
            G[i].indegree=top;      //用数组实现链表功能
            top=i;                  //top是当前入度为0的下标,G[top].indegree是前一个下标
        }
    }
    for(i=0;i<n;i++)
    {
        if(top==-1)     //top==-1本该在n个结点输出后再出现,但提前了,说明图中还剩结点但入度均非0
        {
            printf("\n网中存在回路!\n");
            break;
        }
        else        //如果一直走这条支路,没走if,说明n个结点依次被输出,不存在回路
        {
            j=top;
            top=G[top].indegree;        //退出栈顶元素
            V[i]=G[j].vertex;           //输出一个顶点的信息
            p=G[j].link;
            while(p!=NULL)              //“删除”边结点,并寻找新的入度为0的点
            {
                k=p->adj;
                G[k].indegree--;        //已进栈说明入度为0,此步不会修改栈中顶点的indegree
                if(G[k].indegree==0)
                {
                    G[k].indegree=top;
                    top=k;
                }
                p=p->next;
            }
        }
    }
}

算法分析

设AOV网中有n个顶点,e条边。初始化循环时间为O(n),出栈共n次,对每个顶点的边进行删除共进行e次,从而算法时间复杂度为O(e+n)。

作者:Chase Tsai

出处:https://www.cnblogs.com/chasetsai/p/18212117

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Chase_Tsai  阅读(252)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示