图遍历算法的应用(包括输出长度为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> ...
随机推荐
- 大数据高可用集群环境安装与配置(10)——安装Kafka高可用集群
1. 获取安装包下载链接 访问https://kafka.apache.org/downloads 找到kafka对应版本 需要与服务器安装的scala版本一致(运行spark-shell可以看到当前 ...
- Linux系统中的变量PATH
PATH 作用 在Linux安装一些可执行文件通常要添加路径环境变量PATH,PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接 ...
- VSFTP 连接时425 Security: Bad IP connecting.报错-----解决方法
当登录FTP时候出现这个报错时.是因为PASV模式的安全检查是开启的(默认是开启的) ftp> ls227 Entering Passive Mode (172,16,101,33,35,58 ...
- 吴裕雄--天生自然TensorFlow2教程:数据统计
import tensorflow as tf a = tf.ones([2, 2]) a tf.norm(a) tf.sqrt(tf.reduce_sum(tf.square(a))) a = tf ...
- hive的join优化
“国际大学生节”又称“世界大学生节”.“世界学生日”.“国际学生日”.1946年,世界各国学生代表于布拉格召开全世界学生大会,宣布把每年的11月17日定为“世界大学生节”,以加强全世界大学生的团结和友 ...
- HashMap源码阅读笔记
HashMap源码阅读笔记 本文在此博客的内容上进行了部分修改,旨在加深笔者对HashMap的理解,暂不讨论红黑树相关逻辑 概述 HashMap作为经常使用到的类,大多时候都是只知道大概原理,比如 ...
- Integer和int的区别
1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer ...
- Linux|Zookeeper--CentOS7开机启动Zookeeper
参考 https://www.cnblogs.com/zhangmingcheng/p/7455278.html 在 /etc/rc.d/init.d 下创建zookeeper脚本 #!/bin/ba ...
- Socket通讯的简单用法
1.客户端 package Thread; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...
- 福州大学2020年春软工实践W班第一次作业
作业描述 这个作业属于哪个课程 福州大学2020年春软工实践W班 这个作业要求在哪里 寒假作业(1/2) 这个作业的目标 建立博客.回顾,我的初心.当下和未来.学习路线 作业正文 福州大学2020年春 ...