浙大陈越何钦铭数据结构06-图1 列出连通集

题目

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:
按照"{ v
1

v
2

… v
k

}"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

输入样例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
输出样例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }

代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_VERTEX_NUM 10
#define ELEMENT_TYPE int
#define ERROR -1
#define QUEUE_SIZE 10typedef int Vertex;struct _Queue
{ELEMENT_TYPE *data;int front, rear;int size;
};
typedef struct _Queue *Queue;struct _Edge
{int v, w;
};
typedef struct _Edge *Edge;struct _MGraph
{int nv, ne;int graph[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
};
typedef struct _MGraph *MGraph;Queue createQueue(ELEMENT_TYPE size);
bool isFull(Queue q);
bool isEmpty(Queue q);
bool addQ(Queue q, ELEMENT_TYPE x);
ELEMENT_TYPE delQ(Queue q);void initVisited(bool visited[]);
bool isEdge(MGraph g, Vertex v, Vertex w);
MGraph createGraph(int numVertices);
void insertEdge(MGraph g, Edge e);
MGraph buildGraph();
void dfs(MGraph g, Vertex v);
void bfs(MGraph g, Vertex s);
void listComponentsViaDFS(MGraph g);
void listComponentsViaBFS(MGraph g);bool visited[MAX_VERTEX_NUM] = {false};/*
06-图1 列出连通集难度:1星
重要度:3星,必须掌握的2种图的遍历方式。无向图,用0,1表示顶点间是否有边8 6
0 7
0 1
2 0
4 1
2 4
3 5{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }*/
int main()
{MGraph g = buildGraph();listComponentsViaDFS(g);initVisited(visited);listComponentsViaBFS(g);free(g);return 0;
}// 初始化Visited数组,将所有顶点的访问状态初始化为false
void initVisited(bool visited[])
{Vertex v;for (v = 0; v < MAX_VERTEX_NUM; v++)visited[v] = false;
}bool isEdge(MGraph g, Vertex v, Vertex w)
{return g->graph[v][w] == 1;
}MGraph createGraph(int numVertices)
{MGraph g = (MGraph)malloc(sizeof(struct _MGraph));g->nv = numVertices;g->ne = 0;Vertex v, w;for (v = 0; v < g->nv; v++)for (w = 0; w < g->nv; w++)g->graph[v][w] = 0; // 初始化为0,表示无边return g;
}void insertEdge(MGraph g, Edge e)
{ //(V,W)之间双向置为1,表示无向有边g->graph[e->v][e->w] = 1;g->graph[e->w][e->v] = 1;
}MGraph buildGraph()
{MGraph g;Edge e;Vertex v;int nv, ne;scanf("%d %d", &nv, &ne);g = createGraph(nv);if (ne){g->ne = ne;e = (Edge)malloc(sizeof(struct _Edge));for (v = 0; v < g->ne; v++){scanf("%d %d", &e->v, &e->w);insertEdge(g, e);}free(e);}return g;
}void dfs(MGraph g, Vertex v)
{visited[v] = true;printf("%d ", v);Vertex w;for (w = 0; w < g->nv; w++){if (!visited[w] && isEdge(g, v, w)){dfs(g, w);}}
}// 使用深度优先搜索列出连通集
void listComponentsViaDFS(MGraph g)
{Vertex v;for (v = 0; v < g->nv; v++){if (!visited[v]){printf("{ ");dfs(g, v);printf("}\n");}}
}// 广度优先搜索
void bfs(MGraph g, Vertex s)
{Vertex v, w;Queue q = createQueue(g->nv);printf("%d ", s);visited[s] = true;addQ(q, s);while (!isEmpty(q)){v = delQ(q);for (w = 0; w < g->nv; w++){if (!visited[w] && isEdge(g, v, w)){printf("%d ", w);visited[w] = true;addQ(q, w);}}}free(q->data);free(q);
}// 使用广度优先搜索列出连通集
void listComponentsViaBFS(MGraph g)
{Vertex v;for (v = 0; v < g->nv; v++){if (!visited[v]){printf("{ ");bfs(g, v);printf("}\n");}}
}// 创建队列,Size为队列的最大容量
Queue createQueue(ELEMENT_TYPE size)
{Queue q = (Queue)malloc(sizeof(struct _Queue));q->data = (ELEMENT_TYPE *)malloc(size * sizeof(ELEMENT_TYPE));q->front = q->rear = 0;q->size = QUEUE_SIZE;return q;
}// 判断队列是否已满
bool isFull(Queue q)
{return (q->rear + 1) % q->size == q->front;
}// 判断队列是否为空
bool isEmpty(Queue q)
{return q->front == q->rear;
}// 入队操作
bool addQ(Queue q, ELEMENT_TYPE x)
{if (isFull(q)){printf("Full.\n");return false;}else{q->rear = (q->rear + 1) % q->size; // 队尾索引加1,并考虑循环的情况q->data[q->rear] = x;              // 将X存入队尾位置return true;}
}// 出队操作
ELEMENT_TYPE delQ(Queue q)
{if (isEmpty(q)){printf("Empty.\n");return ERROR;}else{q->front = (q->front + 1) % q->size; // 队头索引加1,并考虑循环的情况return q->data[q->front];            // 返回队头元素}
}

执行结果

在这里插入图片描述

小结

基础的对图的两种方式的遍历,需要熟练掌握。

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

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

相关文章

python操作MySQL、SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引(重点)

python操作MySQL(重要) SQL的由来&#xff1a; MySQL本身就是一款C/S架构&#xff0c;有服务端、有客户端&#xff0c;自身带了有客户端&#xff1a;mysql.exe python这门语言成为了MySQL的客户端(对于一个服务端来说&#xff0c;客户端可以有很多) 操作步骤&#xff1a; …

Kafka - 深入了解Kafka基础架构:Kafka的基本概念

文章目录 Kafka的基本概念 Kafka的基本概念 我们首先了解一些Kafka的基本概念。 1&#xff09;Producer &#xff1a;消息生产者&#xff0c;就是向kafka broker发消息的客户端2&#xff09;Consumer &#xff1a;消息消费者&#xff0c;向kafka broker获取消息的客户端3&…

二、【常用的几种抠图方式一】

文章目录 选框抠图快速选择工具抠图魔棒工具抠图对象选择工具抠图套索工具抠图多边形套索工具抠图磁性套索工具抠图 选框抠图 选框工具抠图适合规则的图形&#xff0c;如下图先使用选框工具框出对象的图轮廓&#xff0c;然后再选择并遮住在里边擦出图形的边缘&#xff0c;根据…

Spring MVC 执行流程

前言 Spring MVC 是一个非常强大的框架&#xff0c;它能够帮助开发人员快速构建高效的 Web 应用程序。然而&#xff0c;要理解 Spring MVC 的执行流程并不容易&#xff0c;因为它涉及到多个组件和模块。在本文中&#xff0c;我们将介绍 Spring MVC 的执行流程&#xff0c;帮助…

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters2. 解决参考 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters …

uniapp vue国际化 i18n

一、安装 vue-i18n npm i vue-i18n 二、新建i18n目录 1、en.json 内容 {"loginPage":{"namePh":"Please enter your login account","passwordPh":"Please enter password"} } 2、zh-CN.json 内容 {"loginPage&qu…

MacOS Mojave(苹果14系统) v10.14.6中文离线安装包

MacOS Mojave是一款先进的操作系统&#xff0c;它拥有诸多出色的特性。其中&#xff0c;夜间模式可以根据时间或用户设置自动切换&#xff0c;改变了UI、壁纸和窗口的样式&#xff0c;使界面在夜晚使用时更为舒适。另外&#xff0c;新的堆栈和群组功能让用户能更方便地分类和整…

软考系统架构师知识点集锦四:信息安全技术基础知识

一、考情分析 二、考点精讲 2.1信息加解密技术 2.1.1对称加密 概念:对称加密(又称为私人密钥加密/共享密钥加密) : 加密与解密使用同一密钥。特点:加密强度不高&#xff0c;但效率高;密钥分发困难。 (大量明文为了保证加密效率一般使用对称加密) 常见对称密钥加密算法:DES:…

PaddleX场景实战:PP-TS在电压预测场景上的应用

时间序列是按照时间发生的先后顺序进行排列的数据点序列&#xff0c;简称时序。时间序列预测即运用历史的多维数据进行统计分析&#xff0c;推测出事物未来的发展趋势。时间序列预测是最常见的时序问题之一&#xff0c;在很多行业都有其应用&#xff0c;且通常时序预测效果对业…

高防回源ip被源站拦截怎么办

​  在进行网站运营过程中&#xff0c;我们经常会遇到DDoS攻击等网络安全威胁。为了保护网站的正常运行&#xff0c;很多企业选择使用高防服务来应对这些攻击。有时候我们可能会遇到一个问题&#xff0c;就是高防回源IP被源站拦截的情况。 那么&#xff0c;当我们发现高防回源…

Vue(uniapp)父组件方法和子组件方法执行优先顺序

涉及到的知识点&#xff1a;watch监控&#xff1a;先看问题&#xff0c;父组件从后端通过$ajax获取数据&#xff0c;在将父组件将值传输给子组件&#xff0c;使用子组件使用created钩子函数获取数据&#xff0c;按自己的想法应该是父组件先获取后端数据&#xff0c;在传入给子组…

【机器学习合集】标准化与池化合集 ->(个人学习记录笔记)

文章目录 标准化与池化1. 标准化/归一化1.1 归一化归一化的作用 1.2 标准化批标准化方法 Batch Normailzation标准化方法的对比自动学习标准化方法 2. 池化2.1 池化的作用2.2 常见的池化方法2.3 池化方法的差异2.4 池化的必要性 标准化与池化 1. 标准化/归一化 1.1 归一化 归…

使用pycharm远程调试

使用pycharm 专业版&#xff0c; 在设置解释器中&#xff0c;具备ssh 解释器功能&#xff1b; 一般在本地无法调试远程端代码&#xff0c;机械性的scp传输文件十分影响工作效率&#xff0c;PyCharm的Pro支持远程Run&#xff0c;Debug&#xff0c;等可视化的功能。 操作系统&…

Git总结

Git介绍 一、Git常用命令 添加、提交 git add 将文件从工作区添加到暂存区&#xff0c;表示git开始追踪文件&#xff0c;如果不想让git追踪了&#xff0c;可以使用 git rm --cached <file> 取消文件追踪&#xff0c;仅仅只代表追踪取消&#xff0c;工作区文件还是照…

4.1 数据库安全性概述

思维导图&#xff1a; 前言&#xff1a; - **第一章回顾**&#xff1a;数据库特点 - 统一的数据保护功能&#xff0c;确保数据安全、可靠、正确有效。 - 数据保护主要涵盖&#xff1a; 1. **数据的安全性**&#xff08;本章焦点&#xff09; 2. 数据的完整性&#xff08;第…

如何将数据库某列的值(如日期)作为表格的列名

如何将数据库某列的值&#xff08;如日期&#xff09;作为表格的列名 需求&#xff1a;前端需要展示如下的二维表格&#xff0c;其中表格的日期是数据库表里data的值&#xff0c;每行不同的值是表格里的字段值&#xff0c;也就是需要将表里的数据行转列&#xff0c;列转行&…

vue手动拖入和导入excel模版

1.列表按钮 <el-button click“importExcel(scope.row.id)” size“small” type“text”>导入excel模版 2.按钮弹框 3.data定义数据 data () { return { projectId: ‘’, importDialogVisible: false, fileList: [], //手动上传 upload_file: ‘’, //导入excel模版…

设计模式思维导图

ProcessOn思维导图链接

性能测试工具:如何学习JMeter?

JMeter是一个广泛应用于Web应用程序性能测试与负载测试的开源负载测试工具&#xff0c;学习JMeter则可以协助软件测试工程师更好地进行自动化性能测试与负载测试&#xff0c;本文就来介绍下如何学习JMeter。 1. 应用场景 (1) Web应用程序、数据库服务器、FTP服务器、SOAP和RE…

移动应用买量越来越难,APP增长的新机遇在哪里?

近两年来&#xff0c;“买量越来越难”是移动互联网每逢年末的固定趋势&#xff0c;“内卷”对于每一个互联网运营人来说成为了越来越普遍的存在。 比如在游戏买量领域&#xff0c;一家厂商做出一个素材之后&#xff0c;很多家都会陆续跟进。其次&#xff0c;素材的生命周期下…