无向图的 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; // ...
随机推荐
- Mave------pom.xml标签详解
pom文件作为MAVEN中重要的配置文件,对于它的配置是相当重要.文件中包含了开发者需遵循的规则.缺陷管理系统.组织.licenses.项目信息.项目依赖性等.下面将重点介绍一下该文件的基本组成与功能 ...
- Confluence 6 影响语言的其他设置
一个独立的用户可以在 Confluence 中选择应用到界面文字和消息中的语言.请注意,支持的语言类型基于在 Confluence 中安装的语言包. 你登录使用 Confluence 回话的语言基于下 ...
- SWift中 '?' must be followed by a call, member lookup, or subscript 错误解决方案
那是因为你在使用自己写的分类时没有指定返回的数据类型 指定下返回数据类型就好了 我是用的oc写的分类在Swift中使用的 错误代码 private lazy var btn = UIButton.C ...
- vue 循环前十条数据
v-for="(item, index) in items" v-if="index<10"
- 高并发编程基础Synchronized与Volatile
关键字Synchronized: 当使用Synchrnized (o) ,锁定 o 的时候,锁定的是 o 指向的堆内存中 new 出来的对象,而非 o 引用,当锁定 o 以后,一旦 o 指向了其他对象 ...
- Metasploit
1.启动Metasploit 声明:本次渗透测试的主机是我自己在自己的攻击主机上搭建的另一个操作系统,为了真实性设置了常见的IP地址,如有重合但绝对不是任何实体公司或者单位的IP地址. 所以不承担任何 ...
- hdu1213并查集
板子题不多说,上代码 #include<iostream> #include<cstdio> #include<cstring> using namespace s ...
- C++ Primer 笔记——lambda表达式
1.一个lambda表达式表示一个可调用的代码单元,可以理解为一个未命名的内联函数,但是与函数不同,lambda表达式可能定义在函数内部.其形式如下: [capture list] (paramete ...
- office之Excel 你会用 Ctrl + E 吗?
从Excel97至现在的最新版本2016,如果评选Excel中最简单.易用.功能最强大的技巧,非2013版新增的“快速填充”(快捷键 Ctrl+E)莫属.向下拖动复制后,打开下拉菜单,就可以看到它的身 ...
- python---实现多个有序列表的合并
我觉得不用抄书上的代码. 遇到实现问题,应该结合python本身的功能去解决. 比如,当合并有序列表时,为什么一定要一项一项比较,而不是使用list的sort函数呢? # coding = utf-8 ...