<数据结构>XDOJ324,325图的优先遍历
XDOJ324.图的广度优先遍历
问题与解答
问题描述
已知无向图的邻接矩阵,以该矩阵为基础,给出广度优先搜索遍历序列,并且给出该无向图的连通分量的个数。在遍历时,当有多个点可选时,优先选择编号小的顶点。(即从顶点1开始进行遍历)
输入格式
第一行是1个正整数,为顶点个数n(n<100),顶点编号依次为1,2,…,n。后面是邻接矩阵,n行n列。
输出格式
共2行。第一行输出为无向图的广度优先搜索遍历序列,输出为顶点编号,顶点编号之间用空格隔开;第二行为无向图的连通分量的个数。
样例输入
6
0 1 0 0 0 0
1 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 1
0 0 0 0 1 0
样例输出
1 2 5 6 3 4
2
//图的广度优先遍历
#include<stdio.h>
#include<queue>
using namespace std;
#define MaxN 100
int G[MaxN][MaxN]; //邻接矩阵表示图
int inq[MaxN] = {false}; //标记数组
int connection = 0; //连通分量
queue<int> que; //队列声明
int n; //结点数
void BFSTrave();
void BFS(int u);
int main(){
int i,j;
//建立图
scanf("%d", &n);
for(i = 0; i < n; i ++){
for(j = 0; j < n; j++){
scanf("%d", &G[i][j]);
}
}
//BFS输出结点及连通分量
BFSTrave();
printf("\n%d", connection);
}
void BFSTrave(){
int u;
for(u = 0; u < n; u++){
if(inq[u] == false){ //若当前结点未被访问
BFS(u); //遍历其所在连通分量
connection++; //连通分量数目+1
}
}
}
void BFS(int u){
int v;
que.push(u); //当前结点入队
inq[u] = true; //标记已访问
printf("%d ", u+1); //输出结点编号
while(!que.empty()){
u = que.front();
que.pop();
for(v = 0; v < n; v++){
if(inq[v] == false && G[u][v] != 0){ //访问u未被访问过的邻接结点
que.push(v); //邻接结点入队
inq[v] = true; //标记已访问
printf("%d ", v+1); //输出结点编号
}
}
}
}
XDOJ325.图的深度优先遍历
问题与描述
问题描述
已知无向图的邻接矩阵,以该矩阵为基础,给出深度优先搜索遍历序列,并且给出该无向图的连通分量的个数。在遍历时,当有多个点可选时,优先选择编号小的顶点。(即从顶点1开始进行遍历)
输入格式
第一行是1个正整数,为顶点个数n(n<100),顶点编号依次为1,2,…,n。后面是邻接矩阵,n行n列。
输出格式
共2行。第一行输出为无向图的深度优先搜索遍历序列,输出为顶点编号,顶点编号之间用空格隔开;第二行为无向图的连通分量的个数。
样例输入
6
0 1 0 0 0 0
1 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 1
0 0 0 0 1 0
样例输出
1 2 5 6 3 4
2
//图的深度优先遍历
#include<stdio.h>
#define MaxN 100
int G[MaxN][MaxN]; //邻接矩阵
int vis[MaxN] = {false}; // 标记矩阵
int connection = 0; //连通分量
int n; //节点数
void DFS(int u);
void DFSTrave();
int main(){
int num = 1;
//建立图
scanf("%d", &n);
int i,j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
scanf("%d",&G[i][j]);
}
}
DFSTrave();
printf("\n%d",connection);
}
void DFSTrave(){
int u;
for(u = 0; u < n; u++){ //遍历每一个顶点
if(vis[u] == false){ // 未被访问
DFS(u); //访问所在的连通分量
connection++; // 连通分量+1
}
}
}
void DFS(int u){
int v;
vis[u] = true; //设置该节点为已访问
printf("%d ", u+1);
for(v = 0; v < n; v++){
if(vis[v] == false && G[u][v] != 0){ //遍历未被访问的邻接点
DFS(v); //递归
}
}
}
题后反思
- BFS与DFS写法上:
都需要建立标记数组vis[]/inq[]
都有两个函数构成
- BFS/BFSTrave(u)
- DFS/DFSTrave(u)
后者遍历u所在的连通分量
- queue的使用:先que.front()再que.pop()
<数据结构>XDOJ324,325图的优先遍历的更多相关文章
- 数据结构之 图论---图的深度遍历( 输出dfs的先后遍历序列 )
图的深度遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出.遍历时,先遍历节点编 ...
- 用js来实现那些数据结构16(图02-图的遍历)
上一篇文章我们简单介绍了一下什么是图,以及用JS来实现一个可以添加顶点和边的图.按照惯例,任何数据结构都不可或缺的一个point就是遍历.也就是获取到数据结构中的所有元素.那么图当然也不例外.这篇文章 ...
- 1048 图的宽度优先遍历序列 c语言
描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge):E是G中边的有限集合.设V={0,1,2,……,n-1},图中的结点又称为顶点(vert ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]
参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...
- 数据结构实验之图论二:图的深度遍历(SDUT 2107)(简单DFS)
题解:图的深度遍历就是顺着一个最初的结点开始,把与它相邻的结点都找到,也就是一直往下搜索直到尽头,然后在顺次找其他的结点. #include <bits/stdc++.h> using n ...
- 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)
1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...
- 【C#数据结构系列】图
一:图 图状结构简称图,是另一种非线性结构,它比树形结构更复杂.树形结构中的结点是一对多的关系,结点间具有明显的层次和分支关系.每一层的结点可以和下一层的多个结点相关,但只能和上一层的一个结点相关.而 ...
- SDUT-2107_图的深度遍历
数据结构实验之图论二:图的深度遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请定一个无向图,顶点编号从0到n-1 ...
随机推荐
- CSS系列,清除浮动方法总结
在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素.在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外 ...
- STL学习笔记1
STL六大部件 容器.分配器.算法.迭代器.适配器.仿函数 他们的关系如下
- winXP 下安装python3.3.2
1. 安装python-3.3.2 2. 安装setuptools 下载解压后,进入路径 python setup.py install 3.安装pip 下载解压后,进入路径 python setup ...
- jenkins之授权和权限管理
#:创建角色,给角色授权,然后创建用户,将用户加入到角色(前提先安装插件) #:先将之前的卸载掉 #:然后重启服务,在可选插件搜索Role #:装完重启服务 root@ubuntu:~# system ...
- 【Linux】【Shell】【Basic】条件测试
1. 数值测试:数值比较 -eq:是否等于: [ $num1 -eq $num2 ] -ne:是否不等于: -gt:是否大于: -ge:是否大于等于: -lt:是否小于: -le:是否小于等于: 2. ...
- 第7章 使用性能利器——Redis
在现今互联网应用中,NoSQL已经广为应用,在互联网中起到加速系统的作用.有两种NoSQL使用最为广泛,那就是Redis和MongoDB.本章将介绍Redis和Spring Boot的结合.Redis ...
- 【简】题解 AWSL090429 【价值】
先考虑当要选的物品一定时 显然有个贪心 wi越小的要越先选 所以先按wi从小到大拍序 因为发现正着递推要记录的状态很多 并且wi的贡献与后面选了几个物品有关 考虑正难则反 倒着递推 提前计算wi的贡献 ...
- Nginx模块之limit_conn & limit_req
limit_conn模块 生效阶段:NGX_HTTP_PREACCESS_PHASE阶段 生效范围:全部worker进程(基于共享内存),进入preaccess阶段前不生效,限制的有效性取决于key的 ...
- IOS开发入门教程-总结篇-写给狂热的编程爱好者们
程序发轻狂,代码阑珊,苹果开发安卓狂!--写给狂热的编程爱好者们 写在前面的话 学习iOS应用程序开发已有一段时间,最近稍微闲下来了,正好也想记录一下前阶段的整个学习过程.索性就从最基础的开始,一步一 ...
- 自己实现一个Electron跨进程消息组件
我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...