图遍历算法的应用(包括输出长度为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> ...
随机推荐
- Day1-T2
原题目 在小X的认知里,质数是除了本身和1以外,没有其他因数的数. 但由于小 X对质数的热爱超乎寻常,所以小X同样喜欢那些虽然不是质数, 但却是由两个质数相乘得来的数. 于是,我们定义一个数小 X喜欢 ...
- 在swift调用OC的第三方库
https://www.jianshu.com/p/4799ac1d7dce 2017.06.02 23:55* 字数 275 阅读 1619评论 0喜欢 3 环境:xcode 8.3.2 系统: M ...
- Python 学习基础
一.编程语言的发展历史 按照翻译方式分为两类: # 编译型(类似于谷歌翻译):如c.java, 运行速度快,调试麻烦 # 解释型(l类似于同声传译):如Python,运行速度慢,调试麻烦 按照特点总结 ...
- python复习——数据输入输出
标准输入:x=input()…… 标准输出:print()…… 格式化输出:1.字符串格式化运算符% 例:print('Values are %s,%s,%s.'%(1,2,['one','two'] ...
- Tensorflow学习教程------过拟合
Tensorflow学习教程------过拟合 回归:过拟合情况 / 分类过拟合 防止过拟合的方法有三种: 1 增加数据集 2 添加正则项 3 Dropout,意思就是训练的时候隐层神经元每次随机 ...
- 对自己有用的VS调试技巧
设置下一条语句 编辑然后继续 符号越界后查看堆对象 查看数组的值 底部 设置下一条语句 返回顶部 一个典型的调试情况就是通过单步跟踪分析为什么一个函数调用失败了.当你发现一个函数调用的另一个函数返回错 ...
- SpringCloud----服务注册中心Eureka
Eureka是Netflix开源的一个RESTful服务,主要用于服务的注册发现.Eureka由两个组件组成:Eureka服务器和Eureka客户端.Eureka服务器用作服务注册服务器.Eureka ...
- 用Pandas Dataframe来架构起金融股票数据的内部形态
2. 金融股票数据的另一个形态,怎样在业务内部流动,同时怎样避免错误 前一篇讲解了股票的原始状态,那麽在业务过程中,数据会变成怎样的形态,来完成众多奇奇怪怪的业务呢,以下将会解答. 首先,任何股票都有 ...
- UVA 11552 序列划分模型 状态设计DP
这个题目刚看到还真不好下手,把一个是 k的倍数的长度的字符串分成len/k块,每块是k个字母,每个块可以重新组合,最后使得整个序列的相同字母尽量在一起,也就是说,最后会把序列从前往后扫,相连的相同字母 ...
- 监听home键的广播
public class HomeKeyReceiver extends BroadcastReceiver implements SanbotConstants{ private HomeKeyLi ...