<数据结构>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 ...
随机推荐
- 容器之分类与各种测试(四)——unordered_set和unordered_map
关于set和map的区别前面已经说过,这里仅是用hashtable将其实现,所以不做过多说明,直接看程序 unordered_set #include<stdexcept> #includ ...
- 小程序的事件 bindtap bindinput
一.bindtap事件 在wxml文件里绑定: <view class='wel-list' bindtap='TZdown'> <image src="/images/w ...
- MFC入门示例之单选框、复选框
设置默认选中一个单选按钮,OnInitDialog()函数中添加: CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO2); 按钮事件处理 1 voi ...
- 用户信息系统_serviceImpl
package com.hopetesting.service.impl;import com.hopetesting.dao.UserDao;import com.hopetesting.dao.i ...
- ABP VNext框架基础知识介绍(1)--框架基础类继承关系
在我较早的时候,就开始研究和介绍ABP框架,ABP框架相对一些其他的框架,它整合了很多.net core的新技术和相关应用场景,虽然最早开始ABP框架是基于.net framework,后来也全部转向 ...
- Python利用ctypes实现C库函数调用
0X00 ctypes 是强大的,使用它我们就能够调 用动态链接库中函数,同时创建各种复杂的 C 数据类型和底层操作函数.使得python也具备了底层内存操作的能力,再配合python本身强大的表达能 ...
- CF1506A Strange Table 题解
Content 给定一个 \(n\times m\) 的矩阵.一开始,\((1,1)\) 所在位置上面的数是 \(1\),随后先由上往下将这一列中的所有位置上面填上 \(2,3,\dots,n\),再 ...
- linux服务器加入AD域(sssd)~ 通过域用户ssh登录加域的linux服务器
搭建域控:参考 https://www.cnblogs.com/taosiyu/p/12009120.html 域控计算机全名: WIN-3PLKM2PLE6E.zhihu.test.com 域:zh ...
- C++ 11 新特性:函数声明auto
1.概览 1.1 函数名中的箭头,用来表明函数的return type,其使用在函数的返回类型需要通过模板参数进行推导,使用在decltype()和declval()不方便的场景 2.正文 c++ 中 ...
- Spring支持的常用数据库传播属性和事务隔离级别
一.事务的传播属性 1.propagation:用来设置事务的传播行为,一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务. (1)propagation.REQU ...