判断从顶点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. 大数据高可用集群环境安装与配置(10)——安装Kafka高可用集群

    1. 获取安装包下载链接 访问https://kafka.apache.org/downloads 找到kafka对应版本 需要与服务器安装的scala版本一致(运行spark-shell可以看到当前 ...

  2. Linux系统中的变量PATH

    PATH 作用 在Linux安装一些可执行文件通常要添加路径环境变量PATH,PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接 ...

  3. VSFTP 连接时425 Security: Bad IP connecting.报错-----解决方法

    当登录FTP时候出现这个报错时.是因为PASV模式的安全检查是开启的(默认是开启的)  ftp> ls227 Entering Passive Mode (172,16,101,33,35,58 ...

  4. 吴裕雄--天生自然TensorFlow2教程:数据统计

    import tensorflow as tf a = tf.ones([2, 2]) a tf.norm(a) tf.sqrt(tf.reduce_sum(tf.square(a))) a = tf ...

  5. hive的join优化

    “国际大学生节”又称“世界大学生节”.“世界学生日”.“国际学生日”.1946年,世界各国学生代表于布拉格召开全世界学生大会,宣布把每年的11月17日定为“世界大学生节”,以加强全世界大学生的团结和友 ...

  6. HashMap源码阅读笔记

    HashMap源码阅读笔记 本文在此博客的内容上进行了部分修改,旨在加深笔者对HashMap的理解,暂不讨论红黑树相关逻辑 概述   HashMap作为经常使用到的类,大多时候都是只知道大概原理,比如 ...

  7. Integer和int的区别

    1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer ...

  8. Linux|Zookeeper--CentOS7开机启动Zookeeper

    参考 https://www.cnblogs.com/zhangmingcheng/p/7455278.html 在 /etc/rc.d/init.d 下创建zookeeper脚本 #!/bin/ba ...

  9. Socket通讯的简单用法

    1.客户端 package Thread; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...

  10. 福州大学2020年春软工实践W班第一次作业

    作业描述 这个作业属于哪个课程 福州大学2020年春软工实践W班 这个作业要求在哪里 寒假作业(1/2) 这个作业的目标 建立博客.回顾,我的初心.当下和未来.学习路线 作业正文 福州大学2020年春 ...