• 拓扑排序


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

      2.拓扑排序的规则:

      ⑴ 从AOV网中选择一个没有前驱的顶点并且输出;

      ⑵ 从AOV网中删去该顶点,并且删去所有以该顶点为尾的弧;

      ⑶ 重复上述两步,直到全部顶点都被输出,或AOV网中不存在没有前驱的顶点。 

      3.示例:

      

      4.实现:

      (1)设计数据结构:

       图的存储结构:采用邻接表存储 ,在顶点表中增加一个入度域。

            

       栈S:存储所有无前驱的顶点。

      

      (2)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Status TopologicalSort(ALGraph G)
    {
        // 有向图G采用邻接表存储结构。
        // 若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则ERROR。
        SqStack S;
        int count,k,i;
        ArcNode *p;
        char indegree[MAX_VERTEX_NUM];
        FindInDegree(G, indegree);   // 对各顶点求入度indegree[0..vernum-1]
        InitStack(S);
        for (i=0; i<G.vexnum; ++i)       // 建零入度顶点栈S
            if (!indegree[i]) Push(S, i);  // 入度为0者进栈
            count = 0;                       // 对输出顶点计数
            while (!StackEmpty(S))
            {
                Pop(S, i);
                printf(i, G.vertices[i].data);  ++count;  // 输出i号顶点并计数
                for (p=G.vertices[i].firstarc;  p;  p=p->nextarc)
                {
                    k = p->adjvex;               // 对i号顶点的每个邻接点的入度减1
                    if (!(--indegree[k]))
                        Push(S, k);  // 若入度减为0,则入栈
                }
            }
            if (count<G.vexnum)
                return ERROR;      // 该有向图有回路
            else
                return OK;
    }

    .......

  • 相关阅读:
    用nodejs的express框架在本机快速搭建一台服务器
    Python版求数组的最大连续区间
    简洁的python测试框架——Croner
    中国有嘻哈——押韵机器人
    服务端测试环境hosts配置检查脚本
    手机客户端软件测试用例设计模板
    【Tomcat】压力测试和优化
    【Tomcat】详解tomcat的连接数与线程池
    【RabbitMQ】2、心得总结,资料汇总
    【高并发解决方案】7、HAProxy安装和配置
  • 原文地址:https://www.cnblogs.com/beipiaoboy/p/3254874.html
Copyright © 2020-2023  润新知