c++如何实现拓扑排序

  介绍

这篇文章主要为大家展示了c++如何实现拓扑排序,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

<强>一、思路

 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++如何实现拓扑排序