介绍
这篇文章主要为大家展示了c++如何实现拓扑排序,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。
<强>一、思路强>
先扫描所有顶的点,把入度为0的顶点(如C, E)进栈,然后,取栈顶元素,退栈,输出取得的栈顶元素v(即入度为0的顶点v)。接着,把顶点v的邻接顶点w的入度减1,如果w的入度变为0,则进栈,接着,取顶点w的兄弟结点(即取顶点v的邻接顶点w的下一邻接顶点),做同样的操作。重复上面步骤,直到输出n个顶点。
如上图:
(1)扫描所有顶的点,把入度为0的顶点进栈:将顶点C, E进栈;
(2)取栈顶元素,退栈,输出取得的栈顶元素E .接着,把顶E点的邻接顶点A, B和F的入度减1,如果入度变为0,则进栈。因为顶点的入度变为0,所以要进栈;
(3)重复(2)步骤,直到输出n个顶点。
<强>二,实现程序:强>
1.图。h:有向图
的ifndef Graph_h #定义Graph_h # include & lt; iostream> 使用名称空间性病; const int DefaultVertices=30; 模板& lt;类T类E> 结构体边缘{//边结点的定义 int桌子;//边的另一顶点位置 Edge*链接;//下一条边链指针 }; 模板& lt;类T类E> {//顶结构顶点点的定义 T数据;//顶点的名字 Edge *调节;//边链表的头指针 }; 模板& lt;类T类E> 类Graphlnk { 公众: const E maxValue=https://www.yisu.com/zixun/100000;//代表无穷大的值(=? Graphlnk (int深圳=DefaultVertices);//构造函数 ~ Graphlnk ();//析构函数 空白inputGraph (int[]数);//建立邻接表表示的图 空白outputGraph ();//输出图中的所有顶点和边信息 T getValue (int i);//取位置为我的顶点中的值 bool insertVertex (const t顶点);//插入顶点 bool insertEdge (v1 int, int v2);//插入边 bool removeVertex (int v);//删除顶点 bool removeEdge (v1 int, int v2);//删除边 int getFirstNeighbor (int v);//取顶点v的第一个邻接顶点 v int getNextNeighbor (int, int w);//取顶点v的邻接顶点w的下一邻接顶点 int getVertexPos (const T顶点);//给出顶点顶点在图中的位置 int numberOfVertices ();//当前顶点数 私人: int maxVertices;//图中最大的顶点数 int numEdges;//当前边数 int numVertices;//当前顶点数 顶点 * nodeTable;//顶点表(各边链表的头结点) };//构造函数:建立一个空的邻接表 模板<类T类E> Graphlnk :: Graphlnk (int sz) { maxVertices=深圳; numVertices=0; numEdges=0; nodeTable=new顶点 [maxVertices];//创建顶点表数组 如果(nodeTable==NULL) { cerr <按娲⒖占浞峙浯砦?” Graphlnk :: ~ Graphlnk () {//删除各边链表中的结点 for (int i=0;我 * p=nodeTable[我].adj;//找到其对应链表的首结点 而(p !=NULL){//不断地删除第一个结点 nodeTable[我]。disorderly=p ->联系; 删除p; p=nodeTable[我].adj; } } 删除[]nodeTable;//删除顶点表数组 }//建立邻接表表示的图 模板<类T类E> 空白Graphlnk :: inputGraph (int数[]){ 整数n, m;//存储顶点树和边数 int i, j, k; T e1, e2;//顶点 cout <扒胧淙攵サ闶捅呤?" n> m; cout <扒胧淙敫鞫サ?“ e1; insertVertex (e1);//插入顶点 } cout <扒胧淙胪嫉母鞅叩男畔?“ e1> e2; j=getVertexPos (e1); k=getVertexPos (e2); 如果(j==1 | | k==1) cout <"边两端点信息有误,请重新输入!” 空白Graphlnk :: outputGraph () { 整数n, m,我; T e1, e2;//顶点 边缘 * p; n=numVertices; m=numEdges; cout <蓖贾械亩サ闶? c++如何实现拓扑排序