当前位置: 首页 > article >正文

用邻接矩阵实现图的深度优先遍历

问题描述

给定一个无向图,用邻接矩阵作为图的存储结构,输出指定顶点出发的深度优先遍历序列。在深度优先遍历的过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问。

输入描述

第一行输入三个正整数,分别表示无向图的顶点数n(2≤n≤100,顶点从1到n编号)、边数m和指定起点编号s。
接下来的m行对应m条边,每行给出两个正整数,分别是该条边直接连通的两个顶点的编号。

输出描述

输出从 s开始的深度优先遍历序列,用一个空格隔开,最后也含有一个空格。如果从 s出发无法遍历到图中的所有顶点,则在第二行输出Non‑connected。

样例输入
5 4 1
1 2
3 1
5 2
2 3
样例输出
1 2 3 5 
Non-connected
#include<stdio.h>
#define MVNUM 10 //最大顶点数
typedef int VerTexType; //顶点数据类型为整型
typedef int ArcType; //边的权值为整型
typedef struct
{
	VerTexType vexs[MVNUM];//顶点表
	ArcType arcs[MVNUM][MVNUM]; //邻接矩阵
	int vexnum, arcnum; //图当前的顶点数和边数
	int visited[MVNUM];
}AMGraph;
static int LocateVex(AMGraph G, int v)  //在图中查找顶点
{
	for (int i = 0; i < G.vexnum; i++)
		if (v == G.vexs[i])
			return i;
	return -1;
}
static void CreateUDG(AMGraph &G)  //创建无向网
{
	for (int i = 0; i < G.vexnum; i++) //创建顶点表
	{
		G.vexs[i] = i + 1;
		G.visited[i+1] = 0;  //未搜索的顶点标记为0
	}
	for (int i = 0; i < G.vexnum; i++)  //邻接矩阵元素置零
		for (int j = 0; j < G.vexnum; j++)
			G.arcs[i][j] = 0;
	for (int k = 0; k < G.arcnum; k++)
	{
		int v1 = 0, v2 = 0;
		scanf("%d%d", &v1, &v2);
		int i = LocateVex(G, v1);
		int j = LocateVex(G, v2);
		G.arcs[i][j] = 1;
		G.arcs[j][i] = 1;
	}
	return;
}
int count = 0;
static void DFS(AMGraph &G, int v)
{
	count++;
	printf("%d ", v);
	G.visited[v] = 1;  //访问过的顶点标记为1
	for (int j = 1; j <= G.vexnum; j++)
		if (G.arcs[v-1][j-1] && !G.visited[j])
			DFS(G, j);  //递归调用
}
int main()
{
	int s = 0;  //指定起点编号
	AMGraph G;
	scanf("%d%d%d", &G.vexnum, &G.arcnum, &s);
	CreateUDG(G);
	DFS(G, s);
	if (count < G.vexnum)
		printf("\nNon-connected");
	return 0;
}   


http://www.kler.cn/a/407007.html

相关文章:

  • 力扣面试经典 150(上)
  • C++ STL - vector/list讲解及迭代器失效
  • Redis ⽀持哪⼏种数据类型?适⽤场景,底层结构
  • Web 入门
  • Kafka 分区分配及再平衡策略深度解析与消费者事务和数据积压的简单介绍
  • 如何利用ChatGPT加速开发与学习:以BPMN编辑器为例
  • 淘宝商品评论爬虫:Java实现指南
  • Javaweb前端HTML css 整体布局
  • 006 单片机嵌入式中的C语言与代码风格规范——常识
  • JDK监控和故障处理工具
  • 深度学习实战人脸识别
  • C语言:函数指针精讲
  • 决策树 DecisionTreeClassifier() 模型参数介绍
  • 在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?
  • 第二十二周机器学习笔记:动手深度学习之——线性代数
  • [RISCV]
  • 【【简单systyem verilog 语言学习使用三--- 新新adder加法器-覆盖率测试】】
  • av_image_get_buffer_size 和 av_image_fill_arrays
  • postsql 以二进制的数据导出sql内容
  • 矩阵的拼接
  • 已阻止加载“http://localhost:8086/xxx.js”的模块,它使用了不允许的 MIME 类型 (“text/plain”)。
  • LLM-Pruner: On the Structural Pruningof Large Language Models
  • iPhone或iPad接收的文件怎么找?怎样删除?
  • Window脚本自动化uiautomation详解_番茄出品
  • 【C++】继承(inheritance)
  • 【优先算法】专题——双指针