无向图的 DFS 和 BFS实现 (以邻接表存储的图)
#include <iostream>
#include <queue> using namespace std; #define MaxVertexNum 10
typedef int Vertex;
typedef int WeightType;
typedef char DataType; bool Visited[MaxVertexNum] = { false }; //边的定义
typedef struct ENode
{
Vertex V1, V2; //有向边<V1,V2>
WeightType Weight; //权重
}*Edge; //邻接点的定义
typedef struct AdjVNode
{
Vertex AdjV; //邻接点下标
WeightType Weight; //边权重
struct AdjVNode *Next; //指向下一个邻接点的指针
}*PtrToAdjVNode; //顶点表头结点的定义
typedef struct VNode
{
/* DataType Data; //存顶点的数据,很多情况下,顶点无数据,此时Data可以不用出现 */
struct AdjVNode *FirstEdge; //边表头指针
}AdjList[MaxVertexNum]; //图结点的定义
typedef struct GNode
{
int Nv; //顶点数
int Ne; //边数
AdjList G; //邻接表表示的图
}*LGraph; LGraph BuildGraph(int vertex_num, int edge_num)
{
LGraph Graph = (LGraph)malloc(sizeof(struct GNode));
Graph->Nv = vertex_num;
Graph->Ne = edge_num;
for (int i = ; i < Graph->Nv; ++i)
Graph->G[i].FirstEdge = NULL; //初始化所有表头指针为NULL Edge E = (Edge)malloc(sizeof(struct ENode));
for (int i = ; i < Graph->Ne; ++i)
{
printf("请输入第%d条边的起点和终点:", i+);
cin >> E->V1 >> E->V2;
E->Weight = ; //这种插入方法将会使下标大的在前,小的在后,所以遍历的时候下标大的会先遍历
//插入边<V1,V2>
PtrToAdjVNode NewNode1 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode1->AdjV = E->V2;
NewNode1->Weight = E->Weight;
NewNode1->Next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = NewNode1; //无向图,还要插入边<V2,V1>
PtrToAdjVNode NewNode2 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode2->AdjV = E->V1;
NewNode2->Weight = E->Weight;
NewNode2->Next = Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge = NewNode2;
} return Graph;
} void Visit(LGraph Graph, Vertex V)
{
cout << V << ' ';
} void ClearVisited()
{
for (int i = ; i < MaxVertexNum; ++i)
Visited[i] = false;
} void DFS(LGraph Graph, Vertex V)
{
Visit(Graph, V);
Visited[V] = true; for (PtrToAdjVNode p = Graph->G[V].FirstEdge; p != NULL; p = p->Next)
{
if (!Visited[p->AdjV])
DFS(Graph, p->AdjV);
}
} void BFS(LGraph Graph, Vertex V)
{
Visit(Graph, V);
Visited[V] = true;
queue<Vertex> Q;
Q.push(V); while(!Q.empty())
{
Vertex W = Q.front();
Q.pop();
for (PtrToAdjVNode p = Graph->G[W].FirstEdge; p != NULL; p = p->Next)
{
if (!Visited[p->AdjV])
{
Visit(Graph, p->AdjV);
Visited[p->AdjV] = true;
Q.push(p->AdjV);
}
}
}
} int main()
{
int nv, ne;
cout << "请输入图的顶点数与边数:";
cin >> nv >> ne;
LGraph Graph = BuildGraph(nv, ne);
cout << endl;
cout << "请输入遍历起点:";
Vertex V;
cin >> V;
cout << "DFS: ";
DFS(Graph, V);
ClearVisited();
cout <<endl;
cout << "BFS: ";
BFS(Graph, V); return ;
}
输出:
无向图的 DFS 和 BFS实现 (以邻接表存储的图)的更多相关文章
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- PTA 邻接表存储图的广度优先遍历(20 分)
6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ...
- PTA 邻接表存储图的广度优先遍历
试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...
- 邻接表存储图,DFS遍历图的java代码实现
import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...
- 数据结构之---C语言实现图的邻接表存储表示
// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...
- 图的邻接表存储 c实现
图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...
- DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...
- 图的邻接表存储表示(C)
//---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...
随机推荐
- iframe与主框架跨域相互访问方法
iframe 与主框架相互访问方法 http://blog.csdn.net/fdipzone/article/details/17619673/ 1.同域相互访问 假设A.html 与 b.htm ...
- ES6之Set与Map加深理解
Set 类似于数组,但是成员的值都是唯一的,没有重复的值,有序. Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化. 用途 数组去重: [...new ...
- 纯css使用线性渐变实现滚动进度条(来自于微信前端早读课)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python之vscode配置开发调试环境
在vscode中下载python插件,下载量最多的就是 打开launch.json,把以下代码粘贴进去即可 { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. ...
- 10,关于在vs2017中的netcore项目使用BundlerMinifier 配置问题
查阅资料 https://github.com/madskristensen/BundlerMinifier/issues/230 今天下载了vs2017 rc 创建了个netcore的web项目,突 ...
- python并发编程之多线程1
一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...
- python网络爬虫笔记(四)
一.python中的高阶函数算法 1.sorted()函数的排序 sorted()函数是一个高阶函数,还可以接受一个key函数来实现自定义的函数排序,key指定的函数作用于每个序列元素上,并根据k ...
- Datagrip导入导出为一个sql文件详细说明 (mysql)
Datagrip导入导出为一个sql文件详细说明 导出: (我的无法截图, 借用一张) 导入: (我的无法截图, 再借用一张) 完
- 把tomcat服务器配置为windows服务的方法
转自:http://ykyfendou.iteye.com/blog/2032916 使用tomcat开发的项目,我们把项目交付给客户的时候,客户都不希望在每次开机的时候都要启动一下tomcat服务器 ...
- python 内置数据类型之数字
目录: 1.2. 数字 1.2.1. 数字类型 1.2.2. 浮点数 1.2.3. 进制记数 1.2.4. 设置小数精度 1.2.5. 分数 1.2.6. 除法 1.2 数字 1.2.1 数字类型 ...