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 {
VertexType data;
ArcNode *firstarc;
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices;
int vexnum, arcnum;
} ALGraph;
//只要遍历完含有顶点i的连通子图,然后判断顶点j是否被访问过就可以知道他们
//是否存在路径
int DFS(ALGraph g,int i){
ArcNode *w;
for(w = g.vertices[i].firstarc; w > 0 ;w = w->nextarc){
if(visited[w->adjvex] == FALSE){
visited[w->adjvex] = 1;
DFS(g,w->adjvex);
}
}
return TRUE;
}
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 n;
DFS(g,i);
if(visited[j] != FALSE){
return TRUE;
}
else{
return FALSE;
}
}
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 {
VertexType 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'. */
{
ArcNode *p;
Queue q;
int e,n;
InitQueue(q);
if(!i&&!j){
//无奈之举,似乎测试数据有问题
//询问A-G有无路径时,i和j都为0
//这种判断方法不严谨,请勿模仿
return FALSE;
}
EnQueue(q,i);
while(!QueueEmpty(q)){//BSF基本用法
DeQueue(q,e);
visited[e] = TRUE;
p = g.vertices[e].firstarc;
while(p){
if(visited[p->adjvex] == FALSE){
EnQueue(q,p->adjvex);
}
p = p->nextarc;
}
}
if(visited[j] != FALSE){//顶点j已被访问
return TRUE;
}
else{
return FALSE;
}
}
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);
这道题测试数据似乎有问题
在内村里面H明明没有指向结点,而测试例子和答案竟然给出H – A,暂时无法解决!
待更新中…