云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 2020年整合数据结构作业系统-第七章答案名师精品资料

2020年整合数据结构作业系统-第七章答案名师精品资料

  • 62 次阅读
  • 3 次下载
  • 2025/5/24 5:56:34

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;

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 { 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'. */ {

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, VertexType 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 { VertexType 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; else

depath(sp,g.vertices[l].data); } }

visited[i]=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 contains string components. */ /* Return the number of path using i */

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

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'.*/ 图的邻接表以及相关类型和辅助变量定义如下: Statu

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com