c++计算图任意两点间的所有路径

  

基于连通图,邻接矩阵实现的图,非递归实现。

  

算法思想:

  

设置两个标志位,①该顶点是否入栈,②与该顶点相邻的顶点是否已经访问。

  

,一个将始点标志位①置1,将其入栈

  

,V B查看栈顶节点在图中,有没有可以到达,且没有入栈,且没有从这个节点V出发访问过的节点

  

,C如果有,则将找到的这个节点入栈,这个顶点的标志位①置1,V的对应的此顶点的标志位②置1

  

,D如果没有,V出栈,并且将与V相邻的全部结点设为未访问,即全部的标志位②置0

  

,E当栈顶元素为终点时,设置终点没有被访问过,即①置0,打印栈中元素,弹出栈顶节点

  

,F重复执行B - E,直到栈中元素为空

  

先举一个例子吧

  

 C + +计算图任意两点间的所有路径

  

假设简单连通图如图1所示。假设我们要找出结点3到结点6的所有路径,那么,我们就设结3点为起点,结点6为终点。找到结点3到结点6的所有路径步骤如下:
  1,我们建立一个存储结点的栈结构,将起3点入栈,将结点3标记为入栈状态;
  2,从结点3出发,找到结点3的第一个非入栈没有访问过的邻结点1,将结点1标记为入栈状态,并且将3到1标记为已访问。
  3,从结点1出发,找到结点1的第一个非入栈没有访问过的邻结点0,将结点0标记为入栈状态,并且将1到0标记为已访问。
  4,从结点0出发,找到结点0的第一个非入栈没有访问过的邻结点2,将结点2标记为入栈状态,并且将0到2标记为已访问。
  5,从结点2出发,找到结点2的第一个非入栈没有访问过的邻结点5,将结点5标记为入栈状态,并且将2到5标记为已访问。
  6,从结点5出发,找到结点5的第一个非入栈没有访问过的邻结点6,将结点6标记为入栈状态,并且将5到6标记为已访问。
  7,栈顶结点6是终点,那么,我们就找到了一条起点到终点的路径,输出这条路径。
  8日,从栈顶弹出结点6,将6标记为非入栈状态;
  9日,现在栈顶结点为5,结5点没有非入栈并且非访问的结点,所以从栈顶将结点5弹出,并且将5到6标记为未访问。
  10日,,,,,,,,现在栈顶结点为2,结点2的相邻节5点已访问,6满足非入栈,非访问,那么我们将结6点入栈;
  11日,,,,,,,,现在栈顶为结点6,即找到了第二条路径,输出整个栈,即为第二条路径
  12日,,,,,,,,第8 - 11重复步骤,就可以找到从起3点到终点6的所有路径。
  13日,,,,,,,,栈为空,算法结束。

  

下面讲一下c++代码实现

  

图类,基于邻接矩阵,不详细的写了==

        类图   {   私人:   DataType> CArray<数据类型;顶点;   int边缘[MaxVertices] [MaxVertices];   int numOfEdges;   公众:   图();   ~图();   空白InsertVertex(数据类型顶点);   空白InsertEdge (v1 int, int v2, int重量);   int GetWeight (int, int j);   int GetVertices ();   数据类型GetValue (int i);   };      之前      

首先自己写一个简单的“栈类”,由于新增了些方法所以不完全叫栈

        template<类T>   类堆栈   {   私人:   int m_size;   int m_maxsize;   T *数据;   公众:   堆栈();   ~堆栈();   空虚将数据(T);//压栈   T pop ();//出栈,并返回弹出的元素   T peek ();//查看栈顶元素   bool isEmpty ();//判断是否空   int getSize ();//得到栈的中元素个数   T * getPath ();//返回栈中所有元素   };   template<类T>   Stack <堆栈:: ~堆栈()   {   []删除数据;   }   模板类T> :: pop ()   {   m_size——;   返回数据(m_size);   }      模板类T> <空栈::推动(T d)   {   如果(m_size==m_maxsize)   {   m_maxsize=2 * m_maxsize;   T * new_data=new T [m_maxsize];   for (int i=0;我 :: peek ()   {   返回数据(m_size-1);   }      模板类T> :: isEmpty ()   {   如果(m_size==0)   {   返回TRUE;   }   其他的   {   返回错误;   }   }      模板类T>

c++计算图任意两点间的所有路径