1、 VNode, AdjListMAX_VERTEX_NUM;typedef struct AdjList vertices; int vexnum, arcnum; ALGraph;Status DfsReachable(ALGraph g, int i, int j) int k; ArcNode *p; visitedi=1; for(p=g.verticesi.firstarc;p;p=p-nextarc) if(p) k=p-adjvex; if(k=j)return 1; if(visitedk!=1) if(DfsReachable(g,k,j)return 1; return 0
2、;7.23 同7.22题要求。试基于图的广度优先搜索策略写一算法。Status BfsReachable(ALGraph g, int i, int j);/* Determine whether it exists path from vertex i to */* vertex j in digraph g with Breadth_First Search. */visitedStatus InitQueue(Queue &q);Status EnQueue(Queue &q, int e);Status DeQueue(Queue &q, int &e);Status QueueEmp
3、ty(Queue q);Status GetFront(Queue q, int &Status BfsReachable(ALGraph g, int i, int j) Queue q; int k,n; InitQueue(q); EnQueue(q,i); while(!QueueEmpty(q) DeQueue(q,k); visitedk=1; for(p=g.verticesk.firstarc; n=p- if(n=j)return 1; if(visitedn!=1)EnQueue(q,n);7.24 试利用栈的基本操作编写,按深度优先搜索策略遍历一个强连通图的非递归形式的算
4、法。算法中不规定具体的存储结构,而将图Graph看成是一种抽象的数据类型。void Traverse(Graph dig, VertexType v0, void(*visit)(VertexType);/* Travel the digraph dig with Depth_First Search. */图以及相关类型、函数和辅助变量定义如下:int LocateVex(Graph g, VertexType v);VertexType GetVex(Graph g, int i);int FirstAdjVex(Graph g, int v);int NextAdjVex(Graph g
5、, int v, int w);void visit(char v);Status InitStack(SStack &s);Status Push(SStack &s, SElemType x);Status Pop(SStack &s, SElemType &x);Status StackEmpty(SStack s);Status GetTop(SStack s, SElemType &void Traverse(Graph dig, VertexType v0, void (*visit)(VertexType) int i,v,flag;SStack s;VertexType p;
6、/flag来记录某点还有没有邻接点 InitStack(s); if(dig.vexnum&dig.arcnum) i=LocateVex(dig,v0);visitedi=TRUE;visit(v0);Push(s,v0);StackEmpty(s) GetTop(s,p);v=LocateVex(dig,p);flag=0; for(i=FirstAdjVex(dig,v);i=0;i=NextAdjVex(dig,v,i) if(!visitedi) p=GetVex(dig,i); flag=1; break; if(flag) visit(p); Push(s,p); elsePop
7、(s,p);7.27 采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。Status SinglePath(ALGraph g, VertexType sv, VertexType tv, int k, char *sp);/* Judge whether it exists a path from sv to tv with length k */* in graph g, return path using string sp if exists. */图的邻接表以及相关类型、函数和辅助变量定义如下:typedef char StrARR1
8、00MAX_VERTEX_NUM+1;void inpath(char *&path, VertexType v); /* Add vertex v to path */void depath(char *& /* Remove vertex from Status SinglePath(ALGraph g, VertexType sv, VertexType tv, int k, char *sp) int i,j,l; if(sv=tv & k=0) inpath(sp,tv); return OK; else i=LocateVex(g,sv); inpath(sp,sv); l=p-
9、if(!visitedl) if(SinglePath(g,g.verticesl.data,tv,k-1,sp) depath(sp,g.verticesl.data); visitedi=0;7.28 已知有向图和图中两个顶点u和v,试编写算法求有向图中从u到v的所有简单路径。void AllPath(ALGraph g, VertexType sv, VertexType tv, StrARR &path, int &i);/* Get all the paths from vertex sv to tv, save them */* into Array path which cont
10、ains string components. */* Return the number of path using i */void inpath(char *path, VertexType v);void depath(char *path, VertexType v);void AllPath2(ALGraph g, VertexType sv, VertexType tv,i,int &d,VertexType A) int j,k,l,m,n; j=LocateVex(g,sv); visitedj=1; Ad+=sv; if(sv=tv) m=0; for(n=0;nd;n+)
11、 pathim+=An; i+; for(p=g.verticesj.firstarc; AllPath2(g,g.verticesl.data,tv,path,i,d,A); visitedj=0; d-;i) int d=0,j,l; VertexType AMAX_VERTEX_NUM,BMAX_VERTEX_NUM; for(l=0;l5;l+) strcpy(B,pathl); for(j=0;jstrlen(pathl);j+) depath(pathl,Bj); AllPath2(g,sv,tv,path,i,d,A);7.31 试完成求有向图的强连通分量的算法,并分析算法的时间
12、复杂度。void StronglyConnected(OLGraph dig, StrARR &scc, int &n);/* Get all the strongly connected components in the digraph dig, */* and put the ith into scci which is a string. */图的十字链表以及相关类型和辅助变量定义如下:int finishedMAX_VERTEX_NUM;typedef char StrARRMAX_VERTEX_NUMMAX_VERTEX_NUM+1; / 记录各强连通分量typedef struc
13、t ArcBox int tailvex,headvex; struct ArcBox *hlink,*tlink; ArcBox;typedef struct VexNode ArcBox *firstin,*firstout; VexNode; VexNode xlistMAX_VERTEX_NUM; OLGraph;int count;void DFS1(OLGraph dig,int v);void DFS2(OLGraph dig,int v,StrARR &scc,int j,int k);n) int i,k=0,v; count=0; for(v=0;vheadvex;visi
14、tedw) DFS1(dig,w); finishedcount+=v;scc,int j,int k) sccjk+=dig.xlistv.data; for(p=dig.xlistv.firstin;hlink) w=p-tailvex; DFS2(dig,w,scc,j,k);7.29 试写一个算法,在以邻接矩阵方式存储的有向图G中求顶点i到顶点j的不含回路的、长度为k的路径数。int SimplePath(MGraph G, int i, int j, int k);/* 求有向图G的顶点i到j之间长度为k的简单路径条数 */图的邻接矩阵存储结构的类型定义如下:typedef enum
15、 DG,DN,AG,AN GraphKind; / 有向图,有向网,无向图,无向网 VRType adj; / 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否; / 对带权图,则为权值类型 InfoType *info; / 该弧相关信息的指针(可无)ArcCell,AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM; AdjMatrix arcs; / 邻接矩阵 VertexType vexsMAX_VERTEX_NUM; / 顶点向量 int vexnum,arcnum; / 图的当前顶点数和弧数 GraphKind kind; / 图的种类标志MGraph
16、;int SimplePath(MGraph G, int i, int j, int k) int sum=0,v; if( G.arcsij.adj &k=1 & !visitedj) sum=1; if(k1) visitedi=1;G.vexnum; if(G.arcsiv.adj & sum+=SimplePath(G,v,j,k-1); return sum;int Search(SSTable s, KeyType k);/* Index the element which key is k */* in StaticSearchTable s. */* Return 0 if x is not found. */静态查找表的类型SSTable定义如下:typedef struct KeyType key; . . / 其他数据域 ElemType; ElemType *elem; int length; SSTable;int Search(SSTable a, KeyType k) int i; for(i=1;i=a.length;i+) if(a.elemi.key=k)return i;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1