{
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。
上一篇:混合云环境下基于失效感知的调度策略
下一篇:基于FitNium的Web关键字驱动的测试

vc++几种排序算法演示软件实现

VC++在线学习平台的设计

VC++BlackList的主机防火墙设计+源代码

VC++五子棋游戏的设计

VC++基于GPU高光谱图像目标检测方法

基于VC++五子连珠游戏的设计

基于VC++俄罗斯方块游戏的设计

AT89C52单片机的超声波测距...

公寓空调设计任务书

10万元能开儿童乐园吗,我...

C#学校科研管理系统的设计

志愿者活动的调查问卷表

承德市事业单位档案管理...

神经外科重症监护病房患...

医院财务风险因素分析及管理措施【2367字】

中国学术生态细节考察《...

国内外图像分割技术研究现状