浙大数据结构慕课课后题(06-图1 列出连通集)

devtools/2024/9/25 15:26:03/

题目要求:

给定一个有n个顶点和m条边的无向图,请用深度优先遍历(DFS)和广度优先遍历(BFS)分别列出其所有的连通集。假设顶点从 0 到n-1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式: 

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

输出格式: 

 按照"{ v1​ v2​ ... vk }"的格式,每行输出一个连通集。先输出 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<bits/stdc++.h>
using namespace std;const int MAX_N = 10;
vector<int> adj[MAX_N];
bool visited[MAX_N];  //记录元素是否被访问过void DFS(int v,vector<int> &component){visited[v] = true;component.push_back(v);//按编号递增的顺序访问邻接结点sort(adj[v].begin(),adj[v].end());for(int u : adj[v]){    //把v的邻接点遍历完 if(!visited[u]){DFS(u,component);  //递归}}	
}void BFS(int v,vector<int> &component){queue<int> q;  //用队列辅助进行广度优先搜索q.push(v);visited[v] = true;while(!q.empty()){int u = q.front();q.pop();component.push_back(u);//按编号递增的顺序访问邻接点sort(adj[u].begin(),adj[u].end());for(int w:adj[u]){if(!visited[w]){q.push(w);visited[w] = true;}}	} 
}int main(){int n,m;cin>>n>>m;for(int i =0; i < m; i++){int u,v;              cin>>u>>v;adj[u].push_back(v);adj[v].push_back(u);		}	//DFS找连通分量fill(visited, visited+n, false);   //清空visited上的标记 for(int i = 0; i < n; i++){if(!visited[i]){vector<int> component;     //设定一个component变量用来存储一个连通集的所有元素 DFS(i,component);	cout<<"{ ";for(int v:component){cout<<v<<" ";}cout<<"}"<<"\n"; }	}//BFS找连通分量fill(visited,visited+n,false);for(int i = 0;i < n; i++){if(!visited[i]){vector<int> component;BFS(i,component);cout<<"{ ";for(int v:component){cout<<v<<" ";} cout<<"}"<<"\n";}		} return 0;	
}

总结:

        这题用到了很多stl函数,我也是刚学它们的性质,所以这道题很有参考价值。

        1.vector<int> 型数组对此题使用很方便可以直观的存储每个结点的邻接表,而且可以动态的改变大小,太牛了。

        2.fill函数可以直接把数组的给定下标范围统一修改成一个设定值,这题里用来初始化visited[]数组。

        3.sort函数默认从小到大排序,在存储每一个连通集时可以保证题目中所要求的连通性。

        4.“for(int v:component) ”表达式,这是一个输出容器中元素的简洁方法。把每个元素的值赋值给v进行操作。

        5.注意输出格式,每个元素中间隔有space。

        一下包含了stl的这么多函数,这题我要重点复习^_^ 


http://www.ppmy.cn/devtools/94185.html

相关文章

【产品经理】竞品分析怎么理解?拆解一下

什么叫竞品&#xff1f;&#xff08;研究的对象&#xff09; 竞品看你怎么理解&#xff0c;有时候不一定是你的竞争对手&#xff0c;有可能是其他行业也做了这个功能&#xff0c;那你也可以学习&#xff0c;有类似的功能或者策略都可以学习&#xff0c;不过这个可能在管理学上…

Tomcat文章目录

这是一个Tomcat相关文章的目录&#xff0c;汇总了我写过的Tomcat的所有文章&#xff0c;方便进行查找回顾 第一章&#xff1a;实现一个简单的Web容器 使用Socket编程实现一个简单的服务端程序&#xff0c;但是仅仅支持静态资源&#xff08;html&#xff09;的获取。 第二章&…

2024 年 7 月公链行业研报:市场波动中 Solana 表现抢眼,Layer 2 竞争白热化

作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics 公链 Research 页面 7 月份&#xff0c;加密货币市场表现活跃&#xff0c;波动幅度较大&#xff0c;这一现象映射了全球金融市场的整体趋势。现货以太坊 ETP 在美国的上市&…

proxy负载均衡

endpoint &#xff1a; 终点、终端 看service服务器的ip kubectl get ep backend -> real server &#xff1a;真正提供web服务的服务器 负载均衡器 load balancer --》LB USER -->LB --->BACKEND(real server) nginx SERVICE --->很多的endpoint--》po…

Trie树:定义与应用

Trie树&#xff0c;也称为字典树或前缀树&#xff0c;是一种专门用于快速检索字符串集合中元素的数据结构。它在许多应用中都有广泛的使用&#xff0c;特别是在自动补全、拼写检查、词典管理和前缀匹配等场景中。本文将详细介绍Trie树的定义、构建、应用以及操作&#xff0c;并…

四十、大数据技术之Kafka3.x(3)

&#x1f33b;&#x1f33b; 目录 一、Kafka Broker1.1 Kafka Broker工作流程1.1.1 Zookeeper 存储的Kafka信息1.1.2 Kafka Broker 总体工作流程1.1.3 Broker 重要参数 1.2 生产经验——节点服役和退役1.2.1 服役新节点1.2.2 退役旧节点 1.3 Kafka 副本1.3.1 副本基本信息1.3.2…

vue RSA加密解密(解决加密过长,解密过长返回为null的问题)

1安装 npm i jsencrypt2.rsa.js /* 引入jsencrypt实现数据RSA加密 */ import JSEncrypt from jsencrypt // 处理长文本数据时报错 jsencrypt.js Message too long for RSA /* 引入encryptlong实现数据RSA加密 */ //import Encrypt from encryptlong // encryptlong是基于jsen…

java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)

目录 1、七牛云内容审核介绍 2、查看内容审核官方文档 2.1、文本内容审核 2.1.1、文本内容审核的请求示例 2.1.2、文本内容审核的返回示例 2.2、图片内容审核 2.2.1、请求参数 2.2.2、返回参数 2.3、视频内容审核 3、代码实现 3.1、前期代码准备 3.2、文本内容审核…