毕业论文
计算机论文
经济论文
生物论文
数学论文
物理论文
机械论文
新闻传播论文
音乐舞蹈论文
法学论文
文学论文
材料科学
英语论文
日语论文
化学论文
自动化
管理论文
艺术论文
会计论文
土木工程
电子通信
食品科学
教学论文
医学论文
体育论文
论文下载
研究现状
任务书
开题报告
外文文献翻译
文献综述
范文
VC++有向无环图所有拓扑序列的生成(6)
{
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。
共7页:
上一页
1
2
3
4
5
6
7
下一页
上一篇:
混合云环境下基于失效感知的调度策略
下一篇:
基于FitNium的Web关键字驱动的测试
vc++几种排序算法演示软件实现
VC++在线学习平台的设计
VC++BlackList的主机防火墙设计+源代码
VC++五子棋游戏的设计
VC++基于GPU高光谱图像目标检测方法
基于VC++五子连珠游戏的设计
基于VC++俄罗斯方块游戏的设计
AT89C52单片机的超声波测距...
公寓空调设计任务书
10万元能开儿童乐园吗,我...
C#学校科研管理系统的设计
志愿者活动的调查问卷表
承德市事业单位档案管理...
神经外科重症监护病房患...
医院财务风险因素分析及管理措施【2367字】
中国学术生态细节考察《...
国内外图像分割技术研究现状