图的深度优先遍历DFS (邻接矩阵实现) c语言

2023-11-03

图的遍历是指从图中的某一顶点出发,按照一定的策略访问图中的每一个顶点。每个顶点有且只能被访问一次。

深度优先遍历也叫深度优先搜索(Depth First Search)。

它的遍历规则:先选择一个初始顶点,再规定一个方向,例如往右边一直遍历。于是就往右边一直走,把访问过的顶点做好标记,沿着右边访问完后,回溯到之前访问过的顶点,找找还有没有顶点没有访问的,当所有顶点被访问,完成遍历。

DFS是一个递归地将图中所有顶点访问的过程,类似于树的前序遍历。

用邻接矩阵实现时需注意设置一个布尔类型的访问标志数组  visited

对于m个顶点e条边的图来说,由于邻接矩阵是一个二维数组,故时间复杂度O(㎡)

具体实现代码如下,

#include<stdio.h>
#include<stdlib.h>
//邻接矩阵结构
typedef char VertexType;
typedef int EdgeType;

#define MAX 10
#define INFINITY 65535
#define TRUE 1
#define FALSE 0
typedef int Boole;  //布尔类型 存储TRUE FALSE
Boole visited[MAX];    //访问标志数组 

typedef struct
{
	VertexType vexs[MAX];   //顶点表 
	EdgeType arc[MAX][MAX];   //邻接矩阵 可看作边表   
	int numVertexes,numEdges;
	int GraphType;  //图的类型  无向0,有向1	
}MGraph;

//构造图   有向图和无向图 
void create(MGraph *G)
{
	int i,j,k,w;
	printf("请输入顶点数和边数:\n");
	scanf("%d%d",&G->numVertexes,&G->numEdges);
	fflush(stdin);
	for(i=0;i<G->numVertexes;i++)     //建立顶点表
	{ 
		printf("\n第%d个顶点",i+1);
		scanf("%c",&G->vexs[i]);
		getchar();
	}
	
	for(i=0;i<G->numVertexes;i++)   //矩阵初始化 
		for(j=0;j<G->numVertexes;j++)
			G->arc[i][j]=INFINITY;
			
	for(k=0;k<G->numEdges;k++)
	{
		printf("输入边(Vi,Vj)的上下标i,j和权w(空格隔开):");
		scanf("%d%d%d",&i,&j,&w);
		G->arc[i][j]=w;
		if(G->GraphType==0)      //此时为无向图   有向图与无向的区别就只是这一行代码的有无 
		G->arc[j][i]=G->arc[i][j];
	}			 
} 

void Output(MGraph *G)     //输出邻接矩阵 
{
	int i,j,count=0;
	for(i=0;i<G->numVertexes;i++)
		printf("\t%c",G->vexs[i]);
	printf("\n");
	for(i=0;i<G->numVertexes;i++)
	{
		printf("%4c",G->vexs[i]);
		for(j=0;j<G->numVertexes;j++)
		{	
			
				printf("\t%d",G->arc[i][j]);
				count++;
				if(count%G->numVertexes==0)
				printf("\n");	
		} 
    }	 
 } 




/*深度优先遍历*/



//深度优先递归算法
void DFS(MGraph G,int i)
{
	int j;
	visited[i]=TRUE;   //被访问的标记 
	printf("%c->",G.vexs[i]);
	for(j=0;j<G.numVertexes;j++)
	{
		if(G.arc[i][j]==1&&!visited[j])   //边(i,j)存在且j顶点未被访问,递归 
			DFS(G,j);
	} 
}

//深度优先遍历
void DFStraverse(MGraph G)
{
	
	int i;
	for(i=0;i<G.numVertexes;i++)
		visited[i]=FALSE;
	for(i=0;i<G.numVertexes;i++)
			if(!visited[i])
				DFS(G,i);		
				
} 


int main()
{
	MGraph G;
	int i,j;
	printf("输入生成图的类型(无向图0/有向图1):");
	scanf("%d",&G.GraphType);
	create(&G);	
	printf("邻接矩阵数据如下:\n");
	Output(&G);
	printf("\n");
	DFStraverse(G);
	printf("\n图遍历完毕");
	return 0;	 
}
 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图的深度优先遍历DFS (邻接矩阵实现) c语言 的相关文章

  • 深度学习常用单词

    深度学习英文单词表 英文 缩写 汉语 Absolute value rectification 绝对值整流 Activation Function 激活函数 Accumulated error backpropagation 累积误差反向传

随机推荐

  • proxy代理配置 goproxy 代理配置

    1 百度上搜索 goproxy 2 下载 proxy linux amd64 tar gz 2 1 直接下载地址 该版本 不限制默认数量 调整默认的每秒最大连接数 由默认20改为默认0无限制 https github com snail00
  • Maven配置了junit依赖,jar包已经导入,但是在使用Test测试时报错

    Maven配置了junit依赖 jar包已经导入 但是在使用Test测试时报错 作用域问题 每一个依赖都有一个scope标签标示这个依赖可以在哪里使用 如果作用域为test 那么只能在测试 Test Resource Root 包下使用 一
  • 存储器、运算器、控制器基本结构以及一条指令的执行

    Abstract 此篇文章讲述的是计算机存储器 控制器 运算器的基本结构组成以及指令的具体执行顺序 CPU包括运算器和控制器 而主机主要包括CPU和存储器 内容参考于 哈工大计算机组成原理 刘宏伟 存储器的基本组成 如下图所示 主存由存储体
  • Android获取APP的Package和Activity

    在使用android自动化测试工具中启动应用时 需要填写被测程序的包名和启动的Activity 以下是查看应用包名package和入口activity名称的方法 aapt 使用aapt aapt是sdk自带的一个工具 在sdk builds
  • 糖酵解反应动力学方程的微分方程建模

    糖酵解反应动力学方程的微分方程建模 题目 对于下面的糖酵解反应 设其满足如下动力学方程 d d
  • 服务器卡顿了该如何处理

    服务器卡顿了该如何处理 当Windows系统的服务器出现卡顿问题时 以下是一些常见的故障排除步骤 1 检查网络连接 确保服务器的网络连接正常 检查网络设备 交换机 防火墙等设备 确保它们正常运行 尝试通过其他计算机访问服务器 以确定是否存在
  • jdbc连接MySQL数据库(完整文件+详细说明)

    使用jdbc连接数据库 可以直接在方法中定义url user psd等信息 也可以读取配置文件 但是在web项目中肯定是要使用第二种方式的 为了统一 只介绍第二种方式 步骤 1 创建配置文件db properties 无论是eclipse还
  • VB ListView控件各种操作详解

    Private Sub Form Load ListView1 SmallIcons ImageList1 Object 把ImageList1图标列表控件绑定到 ListView1列表控件中来 ListView1 ListItems Cl
  • nodejs面试官:如何实现jwt鉴权机制?说说你的思路

    一 是什么 JWT JSON Web Token 本质就是一个字符串书写规范 如下图 作用是用来在用户和服务器之间传递安全可靠的信息 在目前前后端分离的开发过程中 使用token鉴权机制用于身份验证是最常见的方案 流程如下 服务器当验证用户
  • 游戏服务器被攻击了怎么办?

    随着互联网的发展 网民数量激增 电子游戏的普及 庞大的玩家数量必然推动游戏市场发展 游戏受到攻击是游戏开发者的痛点 DDOS攻击是流量攻击的一个总称 还包括SYN Flood ACK Flood UDP Flood TCP Flood IC
  • Java按一行一行进行文件的读取或写入

    测试代码 import org junit jupiter api Test import java io import java util Arrays public class FileTest 一行一行读取文件 适合字符读取 若读取中
  • Android 生态消息推送平台介绍

    一 手机厂商平台 华为消息推送服务 华为推送 Push 是为开发者提供的消息推送平台 建立了从云端到手机端的消息推送通道 使应用可以将最新信息及时通知用户 从而构筑良好的用户关系 提升用户的感知和活跃度 推送透传消息 以透传方式将自定义的内
  • Python中“from docx import Document“报错问题以及怎么提取.docx文档中所有的红色字体

    1 Python中 from docx import Document 报错问题 Pycharm中 当我们输入 from docx import Document 报错问题 在Pycharm中 我们若是想要操作word文件 我们就必须要使用
  • 广度优先搜索(1)之树的层序遍历

    文章目录 零 导言 一 例子引入 1 题目描述 2 题目分析 3 算法实现与解释 二 概念定义 1 定义 2 深入理解 3 相关知识 三 相关习题 零 导言 这一系列博客的创作初衷是为了记录自己在刷题过程中对于一些比较经典的并且很哇塞的题型
  • 苹果cmsV10采集插件&&一键配置定时任务采集

    苹果cmsV10采集插件 下载地址 https pan baidu com s 1NuY0sTQbp CjGaXYH2fdsg 支持断点采集 支持添加播放器自定义解析接口 支持批量修改播放器接口 支持全网搜索资源 支持一键配置定时任务 安装
  • 介绍8421码,5421码,2421码

    8421码 5421码 2421码都是用编码中的bcd码组成的 而bcd码是用 4 位二进制来表示 1 位十进制 即使用 4 个位来存储一个十进制的值 使二进制和十进制之间得到快速转换 bcd码又可分为有权码和无权码两类 无权码包括了余3码
  • 一周AIGC丨国内首个估值 100 亿级大模型独角兽诞生,腾讯混元、蚂蚁金融大模型亮相...

    成立于 2019 年的智谱 AI 晋升为国内首个估值超 100 亿人民币的大模型领域独角兽 早一个月把电灯泡拿出来 不重要 的腾讯 最终还是免不了随大流 腾讯混元大模型正式推出 但用户还要排队申请 蚂蚁金融大模在外滩大会亮相 宣称解决产业真
  • C语言必背代码大全

    对于刚学计算机编程的同学来说 每一个编程知识都觉得很重要 下面小编为大家整理了c语言必背代码 希望大家喜欢 1 输出9 9口诀 共9行9列 i控制行 j控制列 include stdio h main int i j result for
  • 2014传智播客C++第三期基础班+就业班至9月份 完整版

    课程简介 第一阶段C语言10天 此阶段兼顾基础班升级学员与直接报就业班学员 突出面试辅导为主 1 常量与变量 数据类型 数据类型转换 数据输入与输出 面试辅导 2 C语言运算符 C语言操作符 C语言表达式 表达式优先级 面试辅导 3 C语言
  • 图的深度优先遍历DFS (邻接矩阵实现) c语言

    图的遍历是指从图中的某一顶点出发 按照一定的策略访问图中的每一个顶点 每个顶点有且只能被访问一次 深度优先遍历也叫深度优先搜索 Depth First Search 它的遍历规则 先选择一个初始顶点 再规定一个方向 例如往右边一直遍历 于是