连通图遍历策略之深度优先搜索(C语言)

深度优先搜素(DFS)

深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

深度优先搜索类似于树的前序遍历
我们依据邻接表进行遍历,还需要运用递归的思想,这类似于堆栈的遍历方式。

同样以如下连通图为例:
连通图
构建其对应的邻接表:
对应邻接表
采用深度优先搜素的遍历顺序如下:
1
2
3
4
5
6
注:蓝线划去的代表该顶点的visit[i]=1,无需多次遍历。

深度优先搜索步骤:

  1. 从某一顶点出发进行访问,该点首先被读入,visit[i]置为1
  2. 依次访问该点的一个邻接点
  3. 若该邻接点还有临界,那么访问该邻接点的一个邻接点;若没有,则返回上一步进行搜索

* 深度优先搜索函数代码:*

void DFS(AdjMatrix *G, int v)
{EdgeNode *p;printf("->%c",G->adjlist[v].vertex);visited[v]=1;p=G->adjlist[v].edgenext;while (p){  if(!visited[p->adjvex]) DFS(G,p->adjvex);p=p->next;}
}   //从第v个顶点出发DFSvoid DFSTraverse(AdjMatrix *G)
{printf("广度优先搜索顺序");for(int v=0;v<G->n;++v)visited[v]=0;for(int v=0;v<G->n;++v)if(!visited[v]) DFS(G,v);//递归调用printf("\n\n"); 
}

具体代码如下:

#include <stdio.h>  
#include <stdlib.h>  
#define  MaxVertices 100
#define MAX_VERTEX_NUM 10
typedef struct node{   //边表 int adjvex;node* next;  
}EdgeNode;  typedef struct{     //顶点表  int vertex;  EdgeNode* edgenext;  
}VertexNode;  typedef VertexNode AdjList[MaxVertices];  typedef struct{   AdjList adjlist;  int n,e;  
}AdjMatrix;  
int visited[MAX_VERTEX_NUM];
void CreateGraph(AdjMatrix* G)  
{  int i,j,k,w,v;  EdgeNode *s;  printf("输入顶点数和边数(中间以空格分开):");  scanf("%d%d",&G->n,&G->e);  printf("建立顶点表\n"); for (i=0;i<G->n;i++)  {  //fflush(stdin);  //如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。//故而使用 fflush(stdin) 是不正确的。getchar(); printf("请输入第%d个顶点的信息:",i+1);G->adjlist[i].vertex=getchar();G->adjlist[i].edgenext=NULL;  }  //前插法 printf("建立边表\n");  for (k=0;k<G->e;k++)  {  printf("输入有连接的顶点序号:");  scanf("%d%d",&i,&j);  //对于直接相连的进行编入(即对输入“0 1”时,在0对应的边表中编入1) i-=1;j-=1; s=(EdgeNode*)malloc(sizeof(EdgeNode));  s->adjvex=j;//边表赋值 s->next=G->adjlist[i].edgenext;  G->adjlist[i].edgenext=s;  //对于间接相连的进行编入(即对输入“0 1”时,在1对应的边表中编入0)s=(EdgeNode*)malloc(sizeof(EdgeNode));  s->adjvex=i;  s->next=G->adjlist[j].edgenext;  G->adjlist[j].edgenext=s;  }  
}   
void DispGraph(AdjMatrix *G)
{int i;for (i=0;i<G->n;i++)  {  printf("%d->",i+1);  while(1)  {             if(G->adjlist[i].edgenext==NULL){printf("^");break;  }printf("%d->",G->adjlist[i].edgenext->adjvex+1);  G->adjlist[i].edgenext=G->adjlist[i].edgenext->next;  }  printf("\n");  }  
} 
void DFS(AdjMatrix *G, int v)
{EdgeNode *p;printf("->%c",G->adjlist[v].vertex);visited[v]=1;p=G->adjlist[v].edgenext;while (p){  if(!visited[p->adjvex]) DFS(G,p->adjvex);p=p->next;}
}   //从第v个顶点出发DFS
void DFSTraverse(AdjMatrix *G)
{printf("广度优先搜索顺序");for(int v=0;v<G->n;++v)visited[v]=0;for(int v=0;v<G->n;++v)if(!visited[v]) DFS(G,v);//递归调用printf("\n\n"); 
}//DFSTraverse
int main()  
{  freopen("1.txt","r",stdin);AdjMatrix* G= (AdjMatrix*)malloc(sizeof(AdjMatrix));  CreateGraph(G); DFSTraverse(G); DispGraph(G); 
}  

测试数据如下:
注:由于测试输入数据较多,程序可以采用文件输入

5 7
1
2
3
4
5
1 2
1 3
1 4
2 3
2 4
3 5
4 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单源最短路径之迪杰斯特拉算法(C语言)

Dijkstra&#xff08;迪杰斯特拉&#xff09;算法 采用广度优先搜索思想&#xff0c;对有向赋权图寻找最短路径。 该算法对于不含负权的有向图来说&#xff0c;是目前已知的最快的单源最短路径算法。 时间复杂度&#xff1a;O&#xff08;n^2&#xff09; 基本原理&#xf…

Mybatis主线流程源码解析

Mybatis的基础使用以及与Spring的相关集成在官方文档都写的非常详细&#xff0c;但无论我们采用xml还是注解方式在使用的过程中经常会出现各种奇怪的问题&#xff0c;需要花费大量的时间解决。 抽空了解一下Mybatis的相关源码还是很有必要。 先来看一个简单的Demo&#xff1a; …

动态规划之背包问题(C语言)

动态规划 动态规划&#xff08;英语&#xff1a;Dynamic programming&#xff0c;简称DP&#xff09;是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题 动态规划思想大致上为&#xff1a;若要解一…

最大子列和问题(JAVA)

最大子列和 问题描述&#xff1a;给定N个整数的序列{A1&#xff0c;A2&#xff0c;A3&#xff0c;…&#xff0c;An}&#xff0c;求解子列和中最大的值。 这里我们给出{-2&#xff0c;11&#xff0c;-4&#xff0c;13&#xff0c;-5&#xff0c;-2}这样一个序列&#xff0c;正…

密码验证

用户在创建一个账户时&#xff0c;需要设置一个密码。密码的复杂程度是安全的保障之一&#xff0c;但是有些用户在设置密码时&#xff0c;总是把密码设置的过于简单&#xff0c;导致用户账户的安全存在威胁。因此&#xff0c;为了提高用户账户的安全性&#xff0c;添加了一个Ja…

阿里云windows/Linux 服务器建站教程,附WordPress配置方法

声明&#xff1a;文章仅供学习使用&#xff0c;故采用了多处链接&#xff0c;如有侵权&#xff0c;请私信我&#xff0c;立删。 最近看到一个学长做的验证界面&#xff0c;很简单的两个文本输入框&#xff0c;但是能给我们群里的小伙伴们做题提供一个验证答案的途径&#xff0…

Maven修改默认仓库为阿里云仓库

Maven 仓库默认在国外&#xff0c; 国内使用难免很慢&#xff0c;我们可以更换为阿里云的仓库。 第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件&#xff0c;在 mirrors 节点上&#xff0c;添加内容如下&#xff1a; <mirrors><mirror><id>…

apache启动错误 AH00072: make_sock: could not bind to address [::]:443

一、安装apche遇到问题 在电脑上win7系统中安装了wnmp&#xff08;nginxMySQLphp7.2&#xff09;后&#xff0c;想要在安装一套wamp&#xff08;apacheMySQLphp7.2&#xff09;。说做就做&#xff0c;wamp的安装就比较简单了&#xff1a;首先&#xff0c;直接下载apache的压缩包…

Page9:结构分解以及系统内部稳定和BIBO稳定概念及其性质[Linear System Theory]

内容包含系统能控性结构分解、系统能观测性结构分解以及系统结构规范分解原理&#xff0c;线性系统的内部稳定、BIBO稳定概念及其性质 转载于:https://www.cnblogs.com/ERFishing/p/10314720.html

Java集合类及常用数据结构

下面这个图示为JAVA的集合类关系图&#xff0c;没用用严格的UML&#xff0c;了解其中的关系即可&#xff0c;其中颜色强调的几个类为常用的集合类。

win7添加开机启动项

添加开机启动项 开始菜单->所有程序->有个“启动”目录&#xff0c;然后右击选择“打开”&#xff0c;之后把软件的快捷方式移动到此目录下&#xff0c;然后重启电脑&#xff0c;就可以了。 注意&#xff1a;如果修改了程序的安装目录&#xff0c;这里需要删除之前的快捷…

续PA协商过程

续PA协商过程 当sw3的接口恢复之后会发生2中情况。 ①sw3的G0/0/2口先发BPDU ②sw3的G0/0/3口先发BPDU sw3先发送BPDU sw3和sw1的交互过程&#xff1a; sw3的2口恢复后&#xff0c;sw3的所有接口&#xff08;除了边缘端口&#xff09;&#xff0c;变为DP&#xff08;discardi…

搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)

拯救同伴问题 问题描述&#xff1a;假设有如下迷宫&#xff0c;求解从某一点出发到目标位置的最短距离 Input: 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 Output: 7 深度优先搜索&#xff08;DFS&#xff09; import java.util.Scanner;public class DF…

PHP7.2的安装与配置(win7)

1、PHP的安装 1&#xff09;、环境安装目录&#xff1a; C:/wamp/|——php|——php7.2|——Apache24|——mysql|——www2&#xff09;、下载 linux专用&#xff1a;http://www.php.net/downloads.php windows专用&#xff1a;http://windows.php.net/download/ 官网里Windo…

搜索算法(二)--DFS/BFS求解炸弹人问题(JAVA )

炸弹人问题 问题描述&#xff1a;小人可以在迷宫中任意地方放置一个炸弹&#xff0c;炸弹可以在以该点为中心的十字方向杀死怪物&#xff0c;但是触碰到墙之后不再能传递攻击。求将一个炸弹放在哪个位置可以杀死更多的怪物&#xff1f;&#xff1f; Input&#xff1a; 13 1…

could not find driver和PDO drivers = no value

could not find driver 使用ThinkPHP5.0.20&#xff08;win7apache2.4.41 php7.2.21MySQL5.7&#xff09;连接MySQL数据库时&#xff0c;报错&#xff1a; 然后使用phpinfo();查看了一下扩展&#xff0c;发现了问题&#xff08;PDO drivers 的值为 no value&#xff09;&…

搜索算法(三)--DFS/BFS求解宝岛探险问题(JAVA )

宝岛探险问题 问题描述&#xff1a;某片海域有诸多岛屿&#xff0c;用0表示海洋&#xff0c;1-9表示陆地&#xff0c;现给定一个岛屿上的坐标点&#xff0c;求解所在岛屿的面积 思路&#xff1a;显然这是一个搜索算法&#xff0c;即只要从当前坐标点开始遍历&#xff0c;每遍…

win7上修改MySQL数据库密码

一、通过命令行方式修改MySQL密码 1、方法一&#xff1a;用mysqladmin 格式&#xff1a;mysqladmin -u用户名 -p旧密码 password 新密码 实例&#xff1a;mysqladmin -uroot -pabc password 123456 2、方法二&#xff1a;用set password 首先&#xff0c;登录MySQL数据库。…

Python爬虫从入门到放弃(二十)之 Scrapy分布式原理

原文地址https://www.cnblogs.com/zhaof/p/7306374.html 关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构&#xff0c;只在本机维护一个爬取队列&#xff0c;Scheduler进行调度&#xff0c;而要实现多态服务器共同爬取数据关键就是共享爬取队列。 这里重…

python-入门

Python入门 阅读目录 一 编程与编程语言二 编程语言分类三 主流编程语言介绍四 python介绍五 安装python解释器六 第一个python程序七 变量八 用户与程序交互九 基本数据类型十 格式化输出十一 基本运算符十二 流程控制之if...else十三 流程控制之while循环十四 流程控制之for循…