无向图的 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; // ...
随机推荐
- winform的水印TextBox
public partial class WaterTextBox : TextBox { private readonly Label lblwaterText = new Label(); pub ...
- SwipeRefreshLayout,用最少的代码定制最美的上下拉刷新样式
下拉刷新框架其实有很多,而且质量都比较高.但是在日常开发中,每一款产品都会有一套自己独特的一套刷新样式.相信有很多小伙伴在个性化定制中都或多或少的遇到过麻烦.今天我就给大家推荐一个在定制方面很出彩的一 ...
- 什么是java序列化,如何实现java 序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化. 可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题. ...
- 设置 Confluence 6 日志
Confluence 使用的是 Apache's log4j 日志服务.能够允许管理员通过编辑配置文件来控制日志的表现和日志输出文件.在系统中有 6 个日志输出级别,请参考 log4j logging ...
- 条件为空的sql你们写过么 (我也是醉了碰到了这种需求,当时还真有点o((⊙﹏⊙))o懵逼.jpg)
需求描述:单表,父子关系,有个统一的主键dict_id和一个父级别的parent_id,查询父级别的字典名称,parent_id是空,本渣用的是mybatis奥!!! 废话不多说,直接上代码mappe ...
- samba 二进制包 tar.gz 安装
一.下载 sudo wget https://download.samba.org/pub/samba/stable/samba-4.8.10.tar.gz 二.解压 sudu tar -xvzf s ...
- java Swing组件和事件处理(二)
1.BoxLayout类可以创建一个布局对象,成为盒式布局,BoxLayout在javax.Swing border 包中,java.swing 包提供一个Box类,该类也是一个类,创建的容器称作一 ...
- Gitbush笔记
1.如果要想模拟浏览器发送get请求,就要使用Request对象,通过Request对象添加HTTP头,就可以伪装成浏览器. from urllib impor request req=request ...
- 课外知识----base64加密
每3个字符产生4位的base64字符,不足3个字符,将用“=”补齐至4位base64字符 例如 00---> MDA= 000--->MDAw base64加密特点 加密后的字符数是4的 ...
- bzoj 2761
神题... 其实这题巨水,用各种诡异的方法都能A,包括STL等等 我之所以写题解,是因为我发现了一个bug:bz和luogu时限有问题! 这题我用了两种做法: ①:直接使用STL-map(不能直接用数 ...