图遍历算法的应用(包括输出长度为l的路径最短最长路径)
判断从顶点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的路径最短最长路径)的更多相关文章
- 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...
- 图的广度优先遍历算法(BFS)
在上一篇文章我们用java演示了图的数据结构以及图涉及到的深度优先遍历算法,本篇文章将继续演示图的广度优先遍历算法.广度优先遍历算法主要是采用了分层的思想进行数据搜索.其中也需要使用另外一种数据结构队 ...
- 图的遍历算法:DFS、BFS
在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...
- java数据结构_笔记(5)_图的算法
图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...
- 一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)
前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈: 算法思想: 1. 栈初始化 2. 输出起始顶点,起始顶点改为“已访问”标志,将 ...
- 基于GraphCuts图割算法的图像分割----OpenCV代码与实现
转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 1.绪论 图切割算法是组合图论 ...
- 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法
1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法
PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...
- 链表创建和链表遍历算法的演示_C语言
今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得: /*24_链表创建和链表遍历算法的演示*/ # include <stdio.h> ...
随机推荐
- FreeImage库的学习和使用
1.FreeImage_SetPixelColor x横轴方向 y纵轴方向 左下角是(0, 0)
- cron 表达式0 0/10 * * * 与 0 */10 * * *的区别
0 0/10 * * * 与 0 */10 * * * 的差别在于什么地方.在说这两者的差别之前,先说下各个字符代表的含义.0代表从0分开始,*代表任意字符,/代表递增. 0 0/10 * * *代表 ...
- 十二、CI框架之数据库查询
一.在database文件中写明数据库相关信息 二.我们数据库中的表如图所示 三.在CI中查询数据库内容 四.在浏览器输出 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金 ...
- CSS font-family 各字体一览表
windows常见内置中文字体字体中文名 字体英文名宋体 SimSun(浏览器默认) 黑体 SimHei 微软雅黑 ...
- Swift字符串截取与Range使用
1.String.Index String.Index表示一个位置,使用String与String.Index可以获取该位置的Character let str = "123456789&q ...
- 201803-2 碰撞的小球 Java
思路: 直接按照题意模拟,感觉没什么太好的办法.另外注意:int这种基础数据类型不能用equals这个方法 ,必须是Integer类型 import java.util.Scanner; public ...
- VSFTP 连接时425 Security: Bad IP connecting.报错-----解决方法
当登录FTP时候出现这个报错时.是因为PASV模式的安全检查是开启的(默认是开启的) ftp> ls227 Entering Passive Mode (172,16,101,33,35,58 ...
- hive的join优化
“国际大学生节”又称“世界大学生节”.“世界学生日”.“国际学生日”.1946年,世界各国学生代表于布拉格召开全世界学生大会,宣布把每年的11月17日定为“世界大学生节”,以加强全世界大学生的团结和友 ...
- Day 11:静态导入、增强for循环、可变参数的自动装箱与拆箱
jdk1.5新特性-------静态导入 静态导入的作用: 简化书写. 静态导入可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员: 静态导入要注意的 ...
- Linux 基本操作学习
Linux 学习 虚拟机 (Virtual Machine) 指通过软件模拟的具有完整硬件系统功能的,运行再一个完全隔离环境中的完整计算机系统 常用 Linux 命令 命令 对应英文 作用 ls li ...