首页 > 其他分享 >AOV网与拓扑排序

AOV网与拓扑排序

时间:2024-05-25 10:29:40浏览次数:10  
标签:int indegree 拓扑 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)。

标签:int,indegree,拓扑,AOV,顶点,排序,网中
From: https://www.cnblogs.com/chasetsai/p/18212117

相关文章

  • 常见的排序算法——归并排序(六)
    本文记述了多向归并排序的基本思想并给出了一份参考实现代码。在说明了算法的性能后用随机数据进行了验证。◆思想在归并排序、归并排序(二)、归并排序(三)、归并排序(四)中记述的归并排序,都是把待排序范围分成两个部分分别排序的。而多向归并排序是把待排序范围分为K个部分,把它们......
  • C++ 组含子项自定义排序通用设计
    #include<memory>classBase;usingBaseSp=std::shared_ptr<Base>;classBase{public:  explicitBase(intid):ID(id){}  intID;};classSorter{public:  virtualboolsort(constBaseSp&l,constBaseSp&r){returntrue;......
  • 【JAVA系列】JAVA与C#中List分组、排序方法
    C#中List分组、排序、动态分组定义实体类publicclassStudent{publicstringName{get;set;}publicintAge{get;set;}publicstringGrade{get;set;}}按单个属性分组classProgram{staticvoidMain(){List<Stu......
  • 数据结构与算法-快速排序
    快速排序特点:快思路:  1.取第一个元素p,使元素p归位;  2.列表被p分成两部分,左边都比p小,右边都比p大;  3.递归完成排序.快速排序的效率:O(nlogn) 代码实现:defpartition(li,left,right):tmp=li[left]whileleft<right:whileleft<righ......
  • 每日一练——颜色分类(快慢指针排序)
    目录题目代码分析案例模拟重难点分析自检复习 题目75.颜色分类-力扣(LeetCode)代码//交换函数,交换指针a和指针b指向的整数voidswap(int*a,int*b){intt=*a;*a=*b;*b=t;}voidsortColors(int*nums,intnumsSize){//双指针......
  • elasticsearch使用Sort排序时Please use a keyword field instead.
    具体报错信息ElasticsearchStatusException[Elasticsearchexception[type=search_phase_execution_exception,reason=allshardsfailed]];nested:ElasticsearchException[Elasticsearchexception[type=illegal_argument_exception,reason=Textfieldsarenotoptimised......
  • 常见的排序算法——归并排序(五)
    本文记述了自然的两两归并排序并给出了一份参考实现代码。在说明了算法的性能后用随机数据进行了验证。◆思想自然的归并排序是自底向上的。先从第一个元素开始找到一个有序的子范围,然后从紧接着的后面元素开始找到另一个有序的子范围,将这两个子范围归并成一个大的有序子范围。......
  • 分布式任务调度内的 MySQL 分页查询优化 等值在前,排序在中间,范围在最后
    分布式任务调度内的MySQL分页查询优化https://mp.weixin.qq.com/s/VhSzxYIRv83T3D3JD4cORg三、优化方案 3.1优化方案确定 当前SQL执行计划以主键进行顺序遍历,是一个范围扫描,有点像在一片很大的居民区按照序号挨家挨户寻找一些特定的人一样,比较简单也比较低效。 既然......
  • 并行计算排序
    #include<iostream>#include<vector>#include<chrono>#include<algorithm>#include<cstdint>#include<cstdlib>#include<omp.h>//StructuretoholddatastructData{intid;intage;floatweig......
  • 逗号分开的字符串,统计个数从高到底排序
    usesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,System.RegularExpressions, functionCompareStrings(List:TStringList;Index1,Index2:Integer):Integer;beginResult:=StrToInt(List.ValueF......