7.22③试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。
注意:算法中涉及的图的基本操作必须在此存储结构上实现。
实现下列函数:Status DfsReachable(ALGraph g, int i, int j);/* Judge if it exists a path from vertex 'i' to *//* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/图的邻接表以及相关类型和辅助变量定义如下:Status visited[MAX_VERTEX_NUM];typedef char VertexType;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;} ArcNode;typedef struct VNode {V ertexType data;ArcNode *firstarc;} VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;} ALGraph;Status DfsReachable(ALGraph g, int i, int j)/* Judge if it exists a path from vertex 'i' to *//* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/{int k;ArcNode *p;visited[i]=1;for(p=g.vertices[i].firstarc;p;p=p->nextarc){if(p){k=p->adjvex;if(k==j)return 1;if(visited[k]!=1)if(DfsReachable(g,k,j))return 1;}}return 0;}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. *//* Array 'visited' has been initialed to 'false'. */图的邻接表以及相关类型和辅助变量定义如下:Status visited[MAX_VERTEX_NUM];typedef char VertexType;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;} ArcNode;typedef struct VNode {V ertexType data;ArcNode *firstarc;} VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;} ALGraph;Status InitQueue(Queue &q);Status EnQueue(Queue &q, int e);Status DeQueue(Queue &q, int &e);Status QueueEmpty(Queue q);Status GetFront(Queue q, int &e);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. *//* Array 'visited' has been initialed to 'false'. */{Queue q;int k,n;ArcNode *p;InitQueue(q);EnQueue(q,i);while(!QueueEmpty(q)){DeQueue(q,k);visited[k]=1;for(p=g.vertices[k].firstarc;p;p=p->nextarc){n=p->adjvex;if(n==j)return 1;if(visited[n]!=1)EnQueue(q,n);}}return 0;}7.24③试利用栈的基本操作编写,按深度优先搜索策略遍历一个强连通图的非递归形式的算法。
算法中不规定具体的存储结构,而将图Graph看成是一种抽象的数据类型。
实现下列函数:void Traverse(Graph dig, VertexType v0, void(*visit)(VertexType));/* Travel the digraph 'dig' with Depth_First Search. */图以及相关类型、函数和辅助变量定义如下:Status visited[MAX_VERTEX_NUM];int LocateVex(Graph g, VertexType v);VertexType GetVex(Graph g, int i);int FirstAdjVex(Graph g, int v);int NextAdjVex(Graph g, 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 &e);void Traverse(Graph dig, V ertexType v0, void (*visit)(VertexType)){int i,v,flag;SStack s;VertexType p; //flag来记录某点还有没有邻接点InitStack(s);if(dig.vexnum&&dig.arcnum){ i=LocateVex(dig,v0);visited[i]=TRUE;visit(v0);Push(s,v0);while(!StackEmpty(s)){GetTop(s,p);v=LocateVex(dig,p);flag=0;for(i=FirstAdjVex(dig,v);i>=0;i=NextAdjVex(dig,v,i)){ if(!visited[i]) {p=GetVex(dig,i); flag=1; break;}}if(flag){visit(p);visited[i]=TRUE;Push(s,p);}else{Pop(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. */图的邻接表以及相关类型、函数和辅助变量定义如下:Status visited[MAX_VERTEX_NUM];typedef char StrARR[100][MAX_VERTEX_NUM+1];typedef char VertexType;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;} ArcNode;typedef struct VNode {V ertexType data;ArcNode *firstarc;} VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;} ALGraph;int LocateVex(Graph g, VertexType v);void inpath(char *&path, VertexType v);/* Add vertex 'v' to 'path' */void depath(char *&path, VertexType v);/* Remove vertex 'v' from 'path' */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. */{ int i,j,l;ArcNode *p;if(sv==tv && k==0){ inpath(sp,tv);return OK; }else{i=LocateVex(g,sv);visited[i]=1;inpath(sp,sv);for(p=g.vertices[i].firstarc;p;p=p->nextarc){l=p->adjvex;if(!visited[l]){if(SinglePath(g,g.vertices[l].data,tv,k-1,sp))return OK;elsedepath(sp,g.vertices[l].data);}}visited[i]=0;}}7.28⑤已知有向图和图中两个顶点u和v,试编写算法求有向图中从u到v的所有简单路径。