菜单
  

    {
    public:
    string data;
                  Edge* adj;
    Vertex():adj(NULL){}
    ~Vertex(){}
    };
    以图1.1所示的AOV网G1为例,其邻接表存储结构如下图2.3。
    基于邻接表的图类Graph类的C++代码为:
    class Graph
    {
               Vertex* NodeTable;
               int NumVertices;                           //图中节点的数目
               int NumEdge;                              //边数目
    public:
               int* nIndegree;                             //记录定点的入度
               Graph(int size = 0);
               ~Graph();
    int GetVertexPos(const string& vertex);         //名字为vertex节点对应于
                                                     // NodeTale的位置
                void InsertEdge(int v1,int v2);  
                void InsertVertex(const int& index,const string& name);
    bool ToplogicalOrder();                      //如果存在回路,则返回true
           };
    2.2.2 基于栈得到单拓扑序列的原理
    栈在算法中起着存储入度为0顶点的作用,每结束一次循环,栈完成将入度为0的所有顶点压栈和弹出一个栈顶顶点的操作。单一拓扑排序是首先查找邻接表中入度为0的顶点,将其选出,在将其后继顶点的入度减1,再按上一步循环继续查找,直到所有的顶点都被找出。
    不难看出, 每次循环将找出一个顶点,那么只要循环N次,就能将N个顶点依次输出。以图1.1为例,第一次循环将找出顶点0和1都入度为0的条件,那我们将按自己的算法取其一,若取0,那么0的后继有2,那么,当选取0以后,就将2的入度减1。第二次循环时,入度为0 的就是1。又按上述方法继续下去。直到循环结束,总共循环了6次,找到了这6个顶点的拓扑排序的结果的一种012345。
    找6个顶点的拓扑排序要经过6次循环, 那么找N个顶点的排序结果就要经过N 次循环了。上述算法的运行结果只能找出拓扑排序的所有结果中的一种。
    下面仍然以图1.1为例介绍基于栈结构的单拓扑排序算法。图2.4列出了这6个顶点的入度。由图2.4可以看出,刚开始0和1的入度为0,将0和1压入栈,栈中有2个顶点0和1。执行完压栈操作后,弹出栈顶1顶点,作为单拓扑的第一个输出顶点,并将其存在数组a中。同时将1顶点的后继顶点的入度减1,第一次循环就结束了。
    接下来做第二次循环,由图2.4看出,此时发现3顶点的入度为0,所以先将3顶点压栈,然后弹出栈顶的3顶点,将3顶点存入数组中,并将3的后继顶点的入度减1,第二次循环结束,见图2.5。
  1. 上一篇:混合云环境下基于失效感知的调度策略
  2. 下一篇:基于FitNium的Web关键字驱动的测试
  1. 基于VC++的GIS矢量图形系统开发

  2. VC++的高速数据采集系统的软件设计

  3. VC++局域网远程控制软件的设计

  4. VC++局域网监控系统的设计与实现

  5. VC++电能质量监测系统设计

  6. VC++网络版中国象棋的设计

  7. VC++语音的频率域特征分析

  8. 河岸冲刷和泥沙淤积的监测国内外研究现状

  9. 电站锅炉暖风器设计任务书

  10. 乳业同业并购式全产业链...

  11. 当代大学生慈善意识研究+文献综述

  12. 十二层带中心支撑钢结构...

  13. 中考体育项目与体育教学合理结合的研究

  14. 酸性水汽提装置总汽提塔设计+CAD图纸

  15. 杂拟谷盗体内共生菌沃尔...

  16. 大众媒体对公共政策制定的影响

  17. java+mysql车辆管理系统的设计+源代码

  

About

751论文网手机版...

主页:http://www.751com.cn

关闭返回