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 }

2.代码

#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>
#define Maxsize 100
using namespace std;
int g[Maxsize][Maxsize];//定义邻接矩阵
int n,e;
stack<int> s;
queue<int> q;
queue<int> q1;
int vis[Maxsize]={0};
int visb[Maxsize]={0};
void DFS(int v)//n节点数
{int i;s.push(v);vis[v]=1;//标记已经访问for(i=0;i<n;i++){if(g[v][i]==1&&vis[i]==0)DFS(i);}
}
void printDFS()
{int x,i;x=s.size();int a[x];for(i=0;i<x;i++){a[i]=s.top();s.pop();}printf("{");for(i=x-1;i>=0;i--){printf(" %d",a[i]);}printf(" }\n");
}
void ListComponetsDFS( )
{int i;for(i=0;i<n;i++){if(vis[i]==0){DFS(i);printDFS();}}
}
void BFS(int v)
{int i,x;q.push(v);visb[v]=1;while(!q.empty()){x=q.front();q.pop();q1.push(x);for(i=0;i<n;i++){if(g[x][i]==1&&visb[i]==0){q.push(i);visb[i]=1;}}}printf("{");while(!q1.empty()){printf(" %d",q1.front());q1.pop();}printf(" }\n");
}
void ListComponetsBFS( )
{int i;for(i=0;i<n;i++){if(visb[i]==0){BFS(i);}}}
int main()
{int i,j;scanf("%d %d",&n,&e);for(i=0;i<n;i++)for(j=0;j<n;j++)g[i][j]=0;//初始化邻接矩阵int v1,v2;for(i=0;i<e;i++){scanf("%d %d",&v1,&v2);g[v1][v2]=1;//插入边g[v2][v1]=1;}ListComponetsDFS( );ListComponetsBFS( );}

3.分析

3.1如何建图:本题直接使用一个二维数组表示邻接矩阵。存储边的权值。首先是初始化图,也就是只有节点没有边的图,所以边权都设为0.之后再插入边,如果存在边,则权值设为1.

3.2 DFS:深度优先搜索,借助栈来模拟整个过程。因为深度优先搜索,沿着一个节点一直向后搜索,之后会按照原来的路径返回,所以刚好满足栈的特性。因为每次都是搜到没有可达的点会停下来,所以每调用一次就是一个连通分量。

3.3 BFS广度优先搜索:深度优先搜索是借助了递归的思想,而广度直接使用了队列。就是每次把访问到的节点压入队列,然后找到该层节点之后,就从队列弹出一个结点,访问下一层。如果队列为空,那么则说明没有符合条件的节点了。

[C++][图]列出连通集相关推荐

  1. 06-图1 列出连通集 —— 非联通图的DFS与BFS

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

  2. 7-6 列出连通集 (25 分)(详解)

    列出连通集 1:思路 : 利用了邻接矩阵储存数据并建图,然后就是 DFS遍历和BFS遍历 只不过是本题需要输出的是非连通图 连通分量 外加俩函数搞定 2:上码 #include<bits/std ...

  3. 06-图1 列出连通集

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

  4. 7-5 列出连通集 (6 分)

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

  5. 7-201 列出连通集 (25 分)

    7-201 列出连通集 (25 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的 ...

  6. 7-2 列出连通集 (25分)

    文章目录 7-2 列出连通集 (25分) 输入格式: 输出格式: 输入样例: 输出样例: 题解 伪代码 代码 7-2 列出连通集 (25分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别 ...

  7. 7-2 列出连通集 (25 分)

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

  8. 列出连通集(java)

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

  9. linux 树状结构图,linux下tree指令的用法, 树状图列出目录, 树状图逐级列出目录...

    tree命令,主要功能是创建文件列表,将所有文件以树的形式列出来 linux下的tree就比较强大了,但一般系统并不自带这个命令,需要手动下载安装, 安装 sudo apt install tree ...

最新文章

  1. 图解粒子群优化算法(PSO)
  2. 《编写高质量代码:改善Java程序的151个建议》笔记
  3. Vue 面试题 (全)
  4. 印度孟买机器人餐厅_宝莱坞机器人2.0:重生归来一起来看印度神片!
  5. Redis——学习之路一(初识redis)
  6. 奇虎360WEB平台部招贤纳士之服务端开发
  7. 定制自己的ubuntu 镜像文件 (remastersys, respin, USB live CD)
  8. 利用python如何进行数据挖掘
  9. abb机器人goto指令用法_详解ABB机器人编程含中英文指令对照
  10. 微博app打开微信小程序的方法
  11. 我的window10
  12. 笔记 |《软件测试技术经典教程》第4章 黑盒测试技术
  13. 文件上传和OSS上传至阿里云
  14. 凡走过必留下痕迹|2019年个人总结
  15. win10系统 oracle11g的安装流程
  16. 服务无法注册到注册中心解决
  17. 《冲锋飞车》游戏技术反馈栏
  18. linux 文件编辑器,用于Linux的文本编辑器(除了Vi)?
  19. 好书好人生--读书的步骤
  20. 港科夜闻丨香港科大校长加入“一群关注社会现况的大学校长之声明”

热门文章

  1. 浪潮服务器上RAID配置实战及RAID相关知识
  2. JAVA工程师个人职业规划
  3. C语言格式化输入和输出; Format格式化
  4. c语言高校信息查询系统,高校人员信息管理系统c语言.doc
  5. Linux系统时区时间修改
  6. 【Unity】Unity中影响性能的几个因素
  7. 仿soul交友盲盒1.0全开源源码
  8. linux内存与扇区,磁盘的基础知识——扇区、柱面、磁道、族
  9. 正则表达式中 前瞻,后顾,负前瞻,负后顾等整理
  10. java安装教程(解决官网下载的安装包为什么没有jre?)