问题:
/*
* Copyright (c)2016,烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:项目4.cpp
* 作 者:陈晨
* 完成日期:2016年11月17日
* 版 本 号:v1.0
*问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题的处理方法。
(1)设计一个算法,判断顶点u到v是否有简单路径
(2)设计一个算法输出图G中从顶点u到v的一条简单路径(设计测试图时,保证图G中从顶点u到v至少有一条简单路径)。
(3)输出从顶点u到v的所有简单路径。
(4)输出图G中从顶点u到v的长度为s的所有简单路径。
(5)求图中通过某顶点k的所有简单回路(若存在)
*输入描述:无
*程序输出:测试数据
*/
程序中graph.h是图存储结构的算法库中的头文件,详见图算法库。
1、是否有简单路径?
问题:假设图G采用邻接表存储,设计一个算法,判断顶点u到v是否有简单路径。
测试图如下:
源文件main.cpp代码:
#include "graph.h"
int visited[MAXV]; //定义存放节点的访问标志的全局数组
void ExistPath(ALGraph *G,int u,int v, bool &has)
{
int w;
ArcNode *p;
visited[u]=1;
if(u==v)
{
has=true;
return;
}
p=G->adjlist[u].firstarc;
while (p!=NULL)
{
w=p->adjvex;
if (visited[w]==0)
ExistPath(G,w,v,has);
p=p->nextarc;
}
}
void HasPath(ALGraph *G,int u,int v)
{
int i;
bool flag = false;
for (i=0; i<G->n; i++)
visited[i]=0; //访问标志数组初始化
ExistPath(G,u,v,flag);
printf(" 从 %d 到 %d ", u, v);
if(flag)
printf("有简单路径\n");
else
printf("无简单路径\n");
}
int main()
{
ALGraph *G;
int A[5][5]=
{
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,1,1},
{0,0,0,0,0},
{1,0,0,1,0},
}; //请画出对应的有向图
ArrayToList(A[0], 5, G);
HasPath(

这篇博客探讨了如何使用深度优先遍历解决图问题,包括判断顶点间是否存在简单路径、输出简单路径、找出所有简单路径以及寻找特定长度的简单回路和通过特定节点的所有简单回路。作者提供了测试用例及运行结果,并总结了深度优先遍历在解决问题中的关键作用。
最低0.47元/天 解锁文章
1340

被折叠的 条评论
为什么被折叠?



