1、实验五有向图的路径问题1. 问题描述对于有向图 G=(V,E),任意 Vi,Vj V(ViVj) ,判断从顶点 Vi 到顶点 Vj 是否存在路径。2. 基本要求(1 ) 设计图的存储结构(2 ) 设计算法完成问题求解(3 ) 设计存储从 Vi 到 Vj 路径的存储结构(4) 输入:图可以初始化方式获取、从键盘读入或从文件读入3. 存储结构struct ArcNode /定义边表结点int adjvex; /其代表邻接点域,即是结点数组下标ArcNode *next;struct VertexNode /定义顶点表结点T vertex;ArcNode *firstedge;核心函数初始化函数AL
2、Graph:ALGraph(T a,int n,int e)vertexNum=n;arcNum=e;for(int i=0;iij;ArcNode *s;s=new ArcNode;s-adjvex=j; /输入依附的两个顶点的序号s-next=adjlisti.firstedge;adjlisti.firstedge=s; /头插法判断两点是否存在路径int ALGraph:DFS1(int i,int j)int stackMaxSize;int top;int yes;int visited3MaxSize;for(int k=0;kadjvex;/coutnext;/if(!p) t
3、op-; /注意这里的 p 值代表的是顶点表的 firstedge,其始终在,这行代码将使程序陷入是循环,无法得出正确的结果return yes;4. 源程序#include/#includeconst int MaxSize=10;/templatestruct ArcNode /定义边表结点int adjvex; /其代表邻接点域,即是结点数组下标ArcNode *next;templatestruct VertexNode /定义顶点表结点T vertex;ArcNode *firstedge;template class ALGraphpublic:ALGraph(T a,int n,
4、int e);/ALGraph(); /析构函数可以由系统自己调用,如果定义了,没有写出其算,就容易出错,thiscall-void DFSTraverse(int v);void BFSTraverse(int v);void DFS(int v);int DFS1(int i,int j);private:VertexNode adjlistMaxSize; /定义结点数组,存放顶点,注意 vertexNode 后面的不要忘记了, c+模板机制int vertexNum,arcNum;int visitedMaxSize;templateALGraph:ALGraph(T a,int n,
5、int e)vertexNum=n;arcNum=e;for(int i=0;iij;ArcNode *s;s=new ArcNode;s-adjvex=j; /输入依附的两个顶点的序号s-next=adjlisti.firstedge;adjlisti.firstedge=s; /头插法templatevoid ALGraph:DFSTraverse(int v)int j;coutadjvex;if(visitedj=0)DFSTraverse(j);p=p-next;template void ALGraph:BFSTraverse(int v)int visited1MaxSize;i
6、nt qMaxSize; /存放的是邻接点域int front,rear;for(int i=0;iadjvex;if(visited1j=0)coutnext;template void ALGraph:DFS(int v) /深度优先非递归算法int i,visited2MaxSize,sMaxSize,top=-1;ArcNode *p;for(i=0;i=-1)v=stop;top-;p=adjlistv.firstedge;while(p!=NULLif(p=NULL)top-;elsev=p-adjvex;coutint ALGraph:DFS1(int i,int j)int s
7、tackMaxSize;int top;int yes;int visited3MaxSize;for(int k=0;kadjvex;/coutnext;/if(!p) top-; /注意这里的 p 值代表的是顶点表的 firstedge,其始终在,这行代码将使程序陷入是循环,无法得出正确的结果return yes;void main()int a5=1,2,3,4,5;ALGraph A(a,5,7); /此数据类型不能为 charcoutmn;cout“yes=“A.DFS1(m,n)endl;if(A.DFS1(m,n)cout“两结点之间存在路径!“endl;else cout“两结点之间不存在路径!“endl;5. 运行截图