判断从顶点u到v是否有路径

void ExistPath(AdjGraph* G, int u, int v, bool& has)
{
int w;
ArcNode* p;
visit[u] = 1;
if (u == v)
{
has = true;
return;
}
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (visit[w] == 0)
ExistPath(G, w, v, has);
p = p->nextarc;
}
}

  输出u到v的一条简单路径

void FindPath(AdjGraph* G, int u, int v, int path[], int d)
{
path[++d] = u;
visit[u] = 1;
if (u == v)
{
for (int i = 0; i <= d; i++)
printf("%d ", path[i]);
printf("\n");
return;
}
ArcNode* p = G->adjlist[u].firstarc;
while (p != NULL)
{
if (visit[p->adjvex] == 0)
FindPath(G, p->adjvex, v, path, d);
p = p->nextarc;
}
}

  输出u到v的所有简单路径,回溯的深度优先搜索算法

void FindAllPath(AdjGraph* G, int u, int v, int path[], int d)
{
path[++d] = u;
visit[u] = 1;
if (u == v)
{
for (int i = 0; i <= d; i++)
printf("%2d", path[i]);
printf("\n");
}
ArcNode* p = G->adjlist[u].firstarc;
while (p!=NULL)
{
if (visit[p->adjvex] == 0)
FindAllPath(G, p->adjvex, v, path, d);
p = p->nextarc;
}
visit[u] = 0;
}

  输出u到v长度为l的路径

void FindlenPath(AdjGraph* G, int u, int v, int l, int path[], int d)
{
path[++d] = u;
visit[u] = 1;
if (u == v && d == l)
{
for (int i = 0; i <= d; i++)
printf("%2d", path[i]);
printf("\n");
}
ArcNode* p = G->adjlist[u].firstarc;
while (p != NULL)
{
if (visit[p->adjvex] == 0)
FindlenPath(G, p->adjvex, v, l, path, d);
p = p->nextarc;
}
visit[u] = 0;
}

  输出u到v的最短路径

typedef struct {
int data;
int parent;
}Queue;
void ShortPath(AdjGraph* G, int u, int v)
{
int w;
ArcNode* p;
Queue qu[MAXV];
int front = -1, rear = -1;
int visit[MAXV] = { 0 };
rear++;
qu[rear].data = u;
qu[rear].parent = -1;
visit[u] = 1;
while (front != rear)
{
front++;
w = qu[front].data;
if (w == v)
{
int i = front;
while (qu[i].parent != -1)
{
printf("%2d", qu[i].data);
i = qu[i].parent; }
printf("%2d\n", qu[i].data);
return;
}
p = G->adjlist[w].firstarc;
while (p != NULL)
{
if (visit[p->adjvex] == 0)
{
rear++;
qu[rear].data = p->adjvex;
qu[rear].parent = front;
visit[p->adjvex] = 1;
}
p = p->nextarc;
}
}
}

  求距离u最短的一个顶点

int Maxdist(AdjGraph* G, int v)
{
ArcNode* p;
int qu[MAXV];
int rear = 0, front = 0;
int visit[MAXV] = { 0 };
int i, j, k;
qu[++rear] = v;
visit[v] = 1;
while (rear != front)
{
front = (front + 1) % MAXV;
k = qu[front];
p = G->adjlist[k].firstarc;
while (p != NULL)
{
if (visit[p->adjvex] == 0)
{
rear = (rear + 1) % MAXV;
qu[rear] = p->adjvex;
visit[p->adjvex] = 1;
}
p = p->nextarc;
}
}
return k;
}

  输出经过k的所有简单路径

void DFSPath(AdjGraph* G, int u, int v, int path[], int d)
{
int w, i;
visit[u] = 1;
path[++d] = u;
ArcNode* p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (w == v && d > 1)
{
printf(" ");
for (i = 0; i <= d; i++)
printf("%d ", path[i]);
printf("%d\n",v);
}
if (visit[w] == 0)
DFSPath(G, w, v, path, d);
p = p->nextarc;
}
visit[u] = 0;
}
void FindCirclePath(AdjGraph* G, int k)
{
int path[MAXV];
DFSPath(G, k, k, path, -1);
}

  

图遍历算法的应用(包括输出长度为l的路径最短最长路径)的更多相关文章

  1. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  2. 图的广度优先遍历算法(BFS)

    在上一篇文章我们用java演示了图的数据结构以及图涉及到的深度优先遍历算法,本篇文章将继续演示图的广度优先遍历算法.广度优先遍历算法主要是采用了分层的思想进行数据搜索.其中也需要使用另外一种数据结构队 ...

  3. 图的遍历算法:DFS、BFS

    在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...

  4. java数据结构_笔记(5)_图的算法

    图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...

  5. 一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)

    前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈: 算法思想:        1. 栈初始化        2. 输出起始顶点,起始顶点改为“已访问”标志,将 ...

  6. 基于GraphCuts图割算法的图像分割----OpenCV代码与实现

    转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 1.绪论 图切割算法是组合图论 ...

  7. 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法

    1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...

  8. 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法

    PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...

  9. 链表创建和链表遍历算法的演示_C语言

    今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得: /*24_链表创建和链表遍历算法的演示*/ # include <stdio.h> ...

随机推荐

  1. java项目提交到码云

    1.在码云上面创建一个新的项目,用于存放提交的项目内容 2.在需要共享的项目上右键-->team-->Share Project分享项目-->勾选 Use or create rep ...

  2. 19 01 16 djano 视图以及url

    视图 后台管理页面做好了,接下来就要做公共访问的页面了.当我们刚刚在浏览器中输入 http://127.0.0.1:8000/admin/ 之后,浏览器显示出了后台管理的登录页面,那有没有同学想过这个 ...

  3. kettle将csv文件导入数据库

    具体过程学习了: 1.连接数据库 2.添加新资源库 3.选择Other Repositories 4.选择Database Repository,第二个需要配置额外参数 5.连接数据库相关设置 6.连 ...

  4. SpringBoot 系列教程之编程式事务使用姿势介绍篇

    SpringBoot 系列教程之编程式事务使用姿势介绍篇 前面介绍的几篇事务的博文,主要是利用@Transactional注解的声明式使用姿势,其好处在于使用简单,侵入性低,可辨识性高(一看就知道使用 ...

  5. Maven - Repository(存储库)

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  6. LeJOS下eclipse通过USB连接EV3

    适用情况:在eclipse安装好LeJOS插件后,再通过USB连接EV3. 第一:更新驱动 在<设备管理器-网络适配器>下更新RNDIS/Ethernet Gadget,电脑需要先连接EV ...

  7. axios请求接口的时候带一个参数

    getHomeInfo () { this.axios.get('/api/index.json?city=' + this.city) .then(this.getHomeInfoSucc) } 尽 ...

  8. JS-语句四

    For 循环: for 循环是创建循环时常会用到的工具. 下面是 for 循环的语法: ; 语句 ; 语句 ) { 被执行的代码 } 其中语句1是初始值:语句2是.条件判断:语句3是状态改变:被执行的 ...

  9. C++交换两个变量值的方法

    简单地列一下交换两个变量值地几种方法. 1.通过第三方实现,这一种也是最最最常见普通的方法: void swap(int *a, int *b) { int tmp = *a; *a = *b; *b ...

  10. 自己组装一台1U服务器

    视频资料链接 自己组装一台1U服务器 执行思路: 1.评估访问了,根据需求确定服务器要求 2.根据要求选择硬件:冗余.稳定等 3.搜索主流服务器参数进行对比,及对比价格 4.咨询IDC机房价格 DIY ...