图的深度优先搜索和广度优先搜索

c++图的广度优先遍历、深度优先遍历 #include "stdafx.h" #include <iostream> #include <vector> using namespace std; /*图的遍历 深度优先遍历(前序遍里):邻接矩阵(无向图,对称) 广度优先遍历(分层遍历) */ /*struct Node { int elem; Node *link; };*/ class Node { pu... 阅读详情

此图是以图的邻接表法作为储存方式,对图进行深度优先搜索和广度优先搜索(均是非递归)

# include <stdio.h>
# include <stdlib.h>
# define True 1
# define False 0
# define Error -1
# define OK 1
# define MAX_VERTEX_NUM 20
int visited[MAX_VERTEX_NUM];
typedef char VertexData;

typedef enum{DG,DN,UDG,UDN} GraphKind;

typedef struct ArcNode{         //弧节点结构
 int adjvex;
 struct ArcNode *nextarc;
// OtherInfo info;
}ArcNode;

typedef struct VertexNode{       //表头节点结构
 VertexData data;
 ArcNode *firstarc;
}VertexNode;

typedef struct {
 VertexNode vertex[MAX_VERTEX_NUM];
 int vexnum,arcnum;
 GraphKind kind;
}AdjList;


//**********************关于栈的知识*******************************
typedef struct node
{
 int num;
 struct node *next;
}LinkStackNode, *LinkStack;

int InitStack(LinkStack *S)           //初始化栈
{
 (*S) = (LinkStack)malloc(sizeof(LinkStackNode));
 (*S)->next = NULL;
 if ((*S) != NULL)
  return True;
 else
  return False;
}

int Push(LinkStack S, int x)         //进栈
{
 LinkStack temp;
 temp = (LinkStack)malloc(sizeof(LinkStackNode));
 if (temp == NULL)
  return False;
 temp->num = x;
 temp->next  = S->next;
 S->next = temp;
 return True;
}

int Pop(LinkStack S, int *x)        //出栈
{
 LinkStack temp;
 temp = S->next;
 if (temp == NULL)
  return False;
 *x = temp->num;
 S->next = temp->next;
 free(temp);
 return True;
}

int IsEmpty(LinkStack S)        //判断栈是否为空
{
 if (S->next == NULL)
  return True;
 else
  return False;
}
//*************************************************************************

//****************************关于队的知识**********************************************
typedef struct Node
{
 int data;
 struct Node *next;
}LinkQueueNode;
typedef struct
{
 LinkQueueNode *front;
 LinkQueueNode *rear;
}LinkQueue;

int InitQueue(LinkQueue *Q)                //   链队列的初始化
{
 Q->front = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
 if (Q->front != NULL)
 {
  Q->rear = Q->front;
  Q->front->next = NULL;
  return (True);
 }
 else
  return False;
}

int EnterQueue(LinkQueue *Q, int x)             //链队列入队
{
 LinkQueueNode *NewNode;
 NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
 if (NewNode != NULL)
 {
  NewNode->data = x;
  NewNode->next = NULL;
  Q->rear->next = NewNode;
  Q->rear = NewNode;
  return True;
 }
 else
  return False;
}

int DeleteQueue(LinkQueue *Q, int *x)      //  链队列出队
{
 LinkQueueNode *p;
 if (Q->front == Q->rear)
  return False;
 p = Q->front->next;
 Q->front->next = p->next;
 if (Q->rear == p)
  Q->rear = Q->front;
 *x = p->data;
 free(p);
 return True;
}
int Empty(LinkQueue *Q)             //判断链栈是否为空
{
 if (Q->front == Q->rear)
  return True;
 else
  return  False;
}

//*************************************************************************************

int FirstAdjVertex(AdjList *g, int v)         //求v的第一个邻接点
{
 int w;
 ArcNode *p;
 p = g->vertex[v].firstarc;
 if (p == NULL)
  return Error;
 w = p->adjvex;
 return w;

}

int NextAdjVertex(AdjList *g, int v, int w)     //求v相对于w的下一个邻接点
{
 int k;
 ArcNode *p;
 p = g->vertex[v].firstarc;
 while (p->adjvex != w)
 {
  p = p->nextarc;
 }
 p = p->nextarc;
 if (p == NULL)
  return Error;
 else
 {
  k = p->adjvex;
  return k;
 }
}
int LocateVertex(AdjList *g, VertexData v)         //求顶点位置函数
{
 int j = Error,k;
 for (k = 0; k < g->vexnum ; k++)
  if (g->vertex[k].data  == v)
  {
   j = k;break;
  }
 return j;
}

void Crtadjlist(AdjList *g)            //创建邻接链表
{
 int n,e,i,j,k;
 char vt,vh;
 ArcNode *p;
 printf("请输入图的顶点个数和弧的个数\n");
 scanf("%d%d", &n, &e);
 g->vexnum  = n;
 g->arcnum  = e;
 printf("请输入顶点信息\n");
 getchar();
 for (i = 0; i < n; i++)
 {
  scanf("%c", &(g->vertex[i].data));
  g->vertex[i].firstarc = NULL;
 }
 printf("请输入弧的两个顶点\n");
 for (k = 0; k < e; k++)
 {
  getchar(); 
  scanf("%c%c",&vt,&vh);
  i = LocateVertex(g,vt);
  j = LocateVertex(g,vh);
  p = (ArcNode *)malloc(sizeof(ArcNode));
  p->adjvex = j;
  p->nextarc = g->vertex[i].firstarc;
  g->vertex[i].firstarc = p;
 }
}

void DepthFirstSearch(AdjList *g, int v0)  //深度优先搜索
{
 LinkStackNode *S;
 int v, w;
 InitStack(&S);
 Push(S, v0);
 while ( !IsEmpty(S))
 {
  Pop(S, &v);
  if (!visited[v])
  {
   printf("%c ",g->vertex[v].data );
   visited[v] = True;
   w = FirstAdjVertex(g,v);
   while (w != -1)
   {
    if (!visited[w])
     Push(S, w);
    w = NextAdjVertex(g,v,w);
   }
  }
 }
}
void TraverseGraph(AdjList *g)      //深搜
{
 int vi;
 for (vi = 0; vi < g->vexnum ; vi++)
  visited[vi] = False;               //初始化标志数组
 for (vi = 0; vi < g->vexnum; vi++)
  if (!visited[vi])
   DepthFirstSearch(g,vi);
}

void BreadthFirstSearch(AdjList *g, int v0)       // 广度优先搜索
{
 LinkQueue Q;
 int v, w;
 printf("%c ", g->vertex[v0].data);
 visited[v0] = True;
 InitQueue(&Q);
 EnterQueue(&Q,v0);
 while (!Empty(&Q))
 {
  DeleteQueue(&Q, &v);
  w = FirstAdjVertex(g, v);
  while (w != -1)
  {
   if (!visited[w])
   {
    printf("%c ",g->vertex[w].data);
    visited[w] = True;
    EnterQueue(&Q,w);
   }
   w = NextAdjVertex(g,v,w);
  }

 }

}
void BreadthTraverseGraph(AdjList *g)      //广搜
{
 int vi;
 for (vi = 0; vi < g->vexnum ; vi++)
  visited[vi] = False;               //初始化标志数组
 for (vi = 0; vi < g->vexnum; vi++)
  if (!visited[vi])
   BreadthFirstSearch(g,vi);
}

int main(void)
{
 AdjList g;
 Crtadjlist (&g);
 printf("深度优先搜索遍历输出\n");
 TraverseGraph(&g);
 printf("\n广度优先搜索遍历输出\n");
 BreadthTraverseGraph(&g);
 printf("\n");
 return 0;
}

数据结构-图的深度优先搜索和广度优先搜索(邻接表实现) 数据结构-图的深度优先搜索和广度优先搜索(邻接表实现) 无需过分关注代码本身,核心在于代码的设计思路 深度优先搜索 利用递归算法实现,代码设计思路就是 : 矩阵有两个for循环,临接表一个for循环对顶点表进行循环遍历加上一个while(p)与p=p->next,利用指针变量拿到该顶点->firstedge域(edgenode类型),再利用该指针变量->adjvex拿到该顶点相关... 阅读详情

相关推荐

图的深度、广度优先遍历(c语言)

本程序方便的实现了图的深度、广度优先遍历。是数据结构中的一部分,现与大家分享

图的深度(DFS)/广度优先搜索算法(BFS)/Dijkstra

类比二叉树先序遍历与图深度优先搜索 在引入图的深度优先搜索之前,为了更加容易理解.先考究一种特殊的图---二叉树的深度优先搜索算法---即二叉树的递归遍历方法. 二叉树的前序遍历算法:   void TreeWalk(node* root) { if(root) { visit(root); TreeWalk(root-&gt;left); TreeWalk(root-&...

优快云 1万+

无向图的建立及其遍历

建立图的邻接表存储结构,输入或存储任意一个无向图,显示图的深度优先搜索遍历路径和广度优先搜索遍历路径。

图——深度优先搜索和广度优先搜索

目录图的深度优先搜索图的广度优先搜索 图的实现方式主要用到矩阵或链表,这里用的矩阵; 图的深度优先搜索就是一条路径一条路径的往完了走,需要用到栈;而广度优先搜索就是一层一层的搜索,需要用到队列; 这个是两种遍历方式都会用到的表示图节点的代码: /** * @ClassName Node * @Description 图节点 * @Author lzq * @Date 2019/6/19 0...

中都 792

建立邻接表,深度搜索无向图

先读取文件通过建立邻接表的方法建立无向图,之后再深度搜索。

Podman修改镜像源教程(附最新docker镜像源)

Podman修改镜像源教程(附最新docker镜像源)

道长的博客 4142

图的广度优先搜索和深度优先搜索

图的广度优先搜索和深度优先搜索,BFS和DFS的算法思路、分析、代码、应用,遍历的生成树、生成森林问题。

24考研人晴落的博客 7023

RAG开源框架深度评测:从RAGFlow到Dify的实战选型指南

本文深度评测了主流RAG开源框架(RAGFlow、Dify、WeKnora)的核心能力与实战表现,提供企业级选型指南。重点对比了文档解析、检索性能和生产部署等关键指标,揭示RAGFlow在复杂文档处理、Dify在低代码开发、WeKnora在腾讯生态集成的差异化优势,并给出技术选型决策树与成本优化方案。

weixin_29294597的博客 828

图的遍历之深度优先搜索和广度优先搜索

深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直...

cowbin2012的专栏 1万+

别只当玩具!聊聊这个555金属探测器电路背后的电磁感应与RLC调谐原理

本文深入解析了555金属探测器电路的工作原理,重点探讨了电磁感应与RLC调谐原理。通过分析电感线圈的电磁特性、RLC谐振电路的行为以及555定时器的多重功能,揭示了这一看似简单的装置如何实现金属检测。文章还提供了灵敏度优化方案和常见问题解决方法,帮助读者从科学角度理解这一实用技术。

weixin_29204205的博客 481

告别理论!手把手教你用Patran/Nastran搞定机翼颤振分析(附完整模型文件)

本文提供了一份详细的机翼颤振分析实战指南,使用Patran/Nastran软件从零开始构建完整分析模型。涵盖几何建模、网格划分、模态分析到气动弹性耦合的全流程,特别适合航空航天领域工程师学习颤振分析技术。教程包含完整模型文件和实用脚本,帮助读者快速掌握这一关键飞行器设计技能。

weixin_30879169的博客 543

图的遍历—深度优先搜索和广度优先搜索

DFS和BFS

2401_83624776的博客 1845

从谱峰搜索到多项式求根:Root-MUSIC算法原理与MATLAB实践

本文深入解析Root-MUSIC算法在阵列信号处理中的原理与应用,通过多项式求根替代传统MUSIC算法的谱峰搜索,显著提升计算效率和精度。文章详细介绍了算法核心思想、MATLAB实现步骤及工程优化技巧,帮助读者掌握这一高效的DOA估计方法。

weixin_30832143的博客 81

图的遍历——广度优先搜索和深度优先搜索

前置知识:图的相关术语和图的表示 图的遍历 和树数据结构类似,我们可以访问图的所有节点。由两种算法可以对图进行遍历:广度优先搜索(breadth-first search,BFS)和深度优先搜索(depth-first search,DFS)。图遍历可以用来寻找特定的顶点或寻找两个顶点之间的路径,检查路径是否相同,检查图是否有环,等等。 在实现算法之前,让我们来更好的理解一下图遍历的思想。 图遍历算法的思想是必须追踪每个第一次访问的节点,并且追踪有哪些节点还没有完全被探索,对于两种图遍历算法,都需要明确指.

pastelsubliminal的博客 2228

MIPI D-PHY TX 一致性测试实例解析 Part 01

汽车电子领域,尤其是ADAS,伴随着摄像头的大规模布局,MIPI信号的使用日益频繁,关于它的验证与分析工作也变得日益关键

一只豌豆象的博客 1万+

fanuc机器人I/O分配

FANUC机器人在和其他外部设备进行通讯时,需要对信号进行配置。 在机器人处于UOP自动分配状态时,系统会自动检索已配对设备,并分配相应的机架号。 当我们需要手动对信号进行分配时,可参考以下机架号进行配置。 不同的通讯协议对应的机架号不同,外部通讯协议常用的机架号参考下表: 序号 机架号 通讯类型 1 0 Process I/O 2 1-15

haier123888的博客 1万+

图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析

BFS/DFS算法解析【算法入门]2018/6/21.前言和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次。但是图的遍历相对树而言要更为复杂。因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中必须记录已被访问的顶点,避免重复访问。根据搜索路径的不同,我们可以将遍历图的方法分为两种:广度优先搜索和深度优先搜索。2.图的基本概念2.1.无向图和无向...

weixin_40953222的博客 17万+

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

Robot_PLC_HMI_Automation 5695

图的深度优先搜索和广度优先搜索的总结

昨天让这两个搜索算法搞的萎靡不振的,今天重新来

zhaoxiaoyao1987的专栏 1043

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

图的遍历(深度优先搜索和广度优先搜索)

图的遍历----->深度优先搜索和广度优先搜索 一、图的遍历 与树的遍历操作类同,图的遍历操作的定义是,访问途中的每个顶点且每个顶点之北访问一次。图的遍历方法有两种:一种是深度优先遍历,另一种是广度优先遍历。图的深度优先遍历类似于树的先根遍历,图的广度优先遍历类同于树的层序遍历。 图的遍历需要考虑的三个问题: (1)图的特点是没有首尾之分,所以算法的参数要指定访问的第一个顶点。 (2)因为对...

冲出仁川,走出马德里,故事还会再继续 1353

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

用邻接矩阵表示图并实现图的广度优先搜索和深度优先搜索

直接上源代码: tu.h文件 typedef enum{FALSE,TRUE} Boolean; Boolean visited[Max_Vertex_Num]; typedef struct { int vexs[Max_Vertex_Num]; //顶点表 int edges[Max_Vertex_Num][Max_Vertex_Num]; //

1246

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JAVA实现图的深度优先搜索和广度优先搜索

深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被

Akaks的博客 1024
上一篇: 最小生成树
下一篇: NYOJ467中缀式变后缀式
java_oracle_c
博客等级 码龄13年 2粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值