浙大陈越何钦铭数据结构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,一经查实,立即删除!

相关文章

Docker多平台、跨平台编译打包

大多数带有Docker官方标识的镜像都提供了多架构支持。如&#xff1a;busybox镜像支持amd64, arm32v5, arm32v6, arm32v7, arm64v8, i386, ppc64le, and s390x。当你在amd64设备上运行容器时&#xff0c;会拉取amd64镜像。 当你需要构建多平台镜像时&#xff0c;可以用 --platf…

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;帮助…

Vue缓存策略:提升应用性能与用户体验

&#x1f31f; Vue缓存策略&#xff1a;提升应用性能与用户体验 &#x1f4aa; 在Vue.js应用程序开发中&#xff0c;缓存是一种常见的优化策略&#xff0c;它可以有效提升应用的性能和用户体验。Vue提供了一些灵活且易于使用的缓存机制&#xff0c;可以帮助我们优化组件的渲染…

springboot移除nacos yml无法加载

springboot2的一个项目移除了nacos&#xff0c;一直起不来。最后发现是配置文件名称没有修改导致的。 需要把bootstrap.yml改成application.yml bootstrap.yml 和 application.yml 都是Spring Boot应用程序的配置文件&#xff0c;但它们有不同的加载顺序和作用&#xff1a; 加…

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…

CentOS卸载LVM磁盘的方法

在客户环境上遇到一个问题&#xff0c;本身的磁盘满了&#xff0c;需要把没有用的lvm逻辑卷卸载掉&#xff0c;然后挂上去&#xff0c;下面记录一下过程。 卸载原磁盘 umount /data # 如果/data目录正在被其他进程使用中&#xff0c;则使用fuser强制关闭&#xff0c;然后Umou…

Android开发中关于Ui的语法糖

一、layout_margin和padding android:layout_margin“10dp”&#xff0c;android:padding"10dp"区别 android:layout_margin"10dp"&#xff1a; 适用对象&#xff1a;用于调整 View 与其父容器或相邻 View 之间的距离&#xff0c;即外边距&#xff08;mar…

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

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

7 IT Career Paths and How to Get Started in 2023

文章目录 7 IT Career Paths and How to Get Started in 2023IT career paths1. Computer support2. Cybersecurity3. Networks and systems4. Software development5. Web development6. Data7. Cloud computing 7 IT Career Paths and How to Get Started in 2023 Working i…

Tomcat的日志接收文件catalina.out nohup.out说明

catalina.out用于接收如下情况的日志&#xff1a; catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr)&#xff0c;这是在tomcat的启动脚本里指定的&#xff0c;如果没有修改的话stdout和stderr会重定向到这里。所以我们在应用里使用System.out打印的东西都会到这…

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

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

建站必须了解的黑科技:AB站投放、clock斗篷

想了解做独立站&#xff0c;但是又不知道做什么产品好&#xff0c;有不少商家抓住了黑五、FP产品这个机会&#xff0c;想把握这种高利润高回报的产品&#xff0c;了解整个独立站建站流程后&#xff0c;不应该单单只是冲动建站&#xff0c;还必须了解之后可能遇到的问题。 你可…

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

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

音视频编解码技术学习笔记

音视频编解码技术是音视频处理领域的重要部分&#xff0c;涉及到对原始音视频数据的压缩、编码和解码。以下是音视频编解码技术的一些要点和难点&#xff1a; 要点&#xff1a; 压缩技术 音视频编解码的核心是对原始音视频数据进行压缩&#xff0c;以减小文件大小和传输带宽…

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

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

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

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