【数据结构-图】图的建立以及广度优先遍历算法

本文利用邻接表的方法将图进行了表示,并且利用广度优先遍历方法对图进行遍历

下面是一个图的示例:

代码如下:

#include<iostream>

using namespace std;

typedef int VexType;

typedef struct Arcnode{

VexType data;

struct Arcnode *nextarc;

}ArcNode;

typedef struct Vexnode

{

VexType data;

ArcNode *firstarc;

}Vnode,AdjList[100];

typedef struct Graph

{

AdjList adjlist;

int vexnum;

int arcnum;

}*MGraph,Graph;

MGraph Create_Graph()

{

MGraph mygraph =new Graph;

int key;

int i;

int m;

int x,y,z;

printf("图一共有多少个顶点?\n");

scanf("%d",&x);

mygraph->vexnum=x;

printf("图一共有多少个边?\n");

scanf("%d",&y);

mygraph->arcnum=y;

printf("请输入每个顶点\n");

for(i=1;i<=mygraph->vexnum;i++)

{

scanf("%d",&z);

mygraph->adjlist[i].data=z;

}

for(i=1;i<=mygraph->vexnum;i++)

{

printf("%d有没有相关连的顶点?有输入1,没有输入0\n",mygraph->adjlist[i].data);

scanf("%d",&key);

if(key)

{

printf("请输入与%d相关联的顶点,以-123结束\n",mygraph->adjlist[i].data);

scanf("%d",&m);

ArcNode *p=new ArcNode;

p->data=m;

p->nextarc=NULL;

mygraph->adjlist[i].firstarc=p;

printf("请输入与%d相关联的顶点,以-123结束\n",mygraph->adjlist[i].data);

scanf("%d",&m);

while(m!=-123)

{

ArcNode *q=new ArcNode;

q->data=m;

p->nextarc=q;

p=q;

printf("请输入与%d相关联的顶点,以-123结束\n",mygraph->adjlist[i].data);

scanf("%d",&m);

}

p->nextarc=NULL;

}

if(!key)

{

mygraph->adjlist[i].firstarc=NULL;

}

//printf("完成了第%d个节点\n",i);

}

printf("done\n");

return mygraph;

}

void prints(MGraph root)

{

MGraph mygraph=root;

int i;

ArcNode *q;

printf("这个图的邻接表表示为:\n");

for(i=1;i<=mygraph->vexnum;i++)

{

printf("%d:",mygraph->adjlist[i].data);

q=mygraph->adjlist[i].firstarc;

if(q)

{

while(q->nextarc!=NULL)

{

printf("%d,",q->data);

q=q->nextarc;

}

printf("%d",q->data);

}

printf("\n");

}

}

void BFS(MGraph root)//广度优先遍历

{

MGraph mygraph=root;

bool *sign=new bool;//标记这个节点是不是被访问了

int i;

for(i=1;i<=mygraph->vexnum;i++)

sign[i]=false;

Vnode *Q[100];

Vnode *p;

ArcNode *q;

int rear=-1;

int front=-1;

printf("广度优先遍历为:");

for(i=1;i<=mygraph->vexnum;i++)

{

if(!sign[i])

{

printf("%d ",mygraph->adjlist[i].data);

sign[i]=1;

}

Q[++rear]=&(mygraph->adjlist[i]);

while(front!=rear)

{

p=Q[++front];

if(p->firstarc!=NULL)

{

q=p->firstarc;

while(q->nextarc!=NULL)

{

if(!sign[q->data])

{

printf("%d ",q->data);

Q[++rear]=&(mygraph->adjlist[q->data]);

sign[q->data]=true;

q=q->nextarc;

}

else

{

q=q->nextarc;

}

}

if(!sign[q->data])

{

printf("%d ",q->data);

Q[++rear]=&(mygraph->adjlist[q->data]);

sign[q->data]=true;

}//访问每个链表中的最后一个元素

}

}

}

}

int main(void)

{

MGraph mygraph;

mygraph=Create_Graph();

BFS(mygraph);

return 0;

}

结果展示:

时间: 2024-08-09 06:33:49

【数据结构-图】图的建立以及广度优先遍历算法的相关文章

《图论》——广度优先遍历算法(BFS)

十大算法之广度优先遍历: 本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,详细方法例如以下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组vet中 3.初始化邻接矩阵. 4.依次输入每条边存储在邻接矩阵array中 输入边依附的两个顶点的序号i,j. 将邻接矩阵的第i行第j列的元素值置为1: 将邻接矩阵的第j行第i列的元素值置为1: 广度优先遍历实现: 1.初始化队列Q 2.訪问顶点v:ifVisit[v]=1;顶点v入队Q; 3.whi

广度优先遍历算法(BFS)

十大算法之广度优先遍历: 本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组vet中 3.初始化邻接矩阵: 4.依次输入每条边存储在邻接矩阵array中 输入边依附的两个顶点的序号i,j: 将邻接矩阵的第i行第j列的元素值置为1: 将邻接矩阵的第j行第i列的元素值置为1: 广度优先遍历实现: 1.初始化队列Q 2.访问顶点v:ifVisit[v]=1;顶点v入队Q; 3.while

图的表示、深度广度遍历算法及其应用

世间的一切对象都可化为节点:世间一切关系都可化为节点间的一条线:从而组成了如梦幻泡影的图.将来的环球必定是图的世界. 一.图的表示 图有有向图和无向图,表示方法一般有邻接表.邻接矩阵等方法,无向图和有向图都可以用这两种方法表示. 图1. 图的例子[1] 1.邻接表 在邻接表中,对于每个顶点u,使用一个链表把所有与u相邻的点点串起来,并标记这个集合为adj(u).举个栗子如下: 图2. 邻接表表示图的例子[1] 在真正操作图进行实验的时候,一般也都使用邻接矩阵表示,例如要存储图1中的有向图,可以直

Java实现图的深度和广度优先遍历算法

概述: 近期要学习写网络爬虫.所以把图的深度和广度搜索都再温习一下. 图结构展示: 实现过程: 首先,我们来看看图结构在代码中的实现.有三块逻辑: 1.图中的节点: public class GraphNode { public List<GraphEdge> edgeList = null; private String label = ""; public GraphNode(String label) { this.label = label; if (edgeLis

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另

数据结构(三十二)图的遍历之广度优先遍历

一.广度优先遍历算法描述 广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS.图的广度优先遍历类似于树的层序遍历. BFS算法描述:从图中的某个顶点v开始,先访问该顶点,再依次访问该顶点的每一个未被访问过的邻接点w1,w2,...:然后按此顺序访问顶点w1,w2...的各个还未 被访问过的邻接点.重复上述过程,直到图中的所有顶点都被访问过为止. 以下图为例子,顶点访问序列为{A B F C I G E D H} 二.广度优先遍历算法实现 原文地址:https

数据结构之图(术语、存储结构、遍历)

1.相关术语 顶点(Vertex).弧(Arc).弧头(初始点).弧尾(终结点).边(Edge).有向图(Directed graph).无向图(Undigraph).完全图(Completed grapg).有向完全图.稀疏图(Sparse graph).稠密图(Dense graph).权(weigh).网(network).无向网.有向网.子图(Subgraph).邻接点(Adjacent).度(Degree).入度(Indegree).出度(Outdegree).路径(path).简单路

数据结构之图(存储结构、遍历)

新学期开始了,开始专心于技术上了,上学期的寒假总是那么短暂,飘飘乎就这样逝去,今天补补上学期还没学完的数据结构---图,希望能和大家一起探讨,共同进步~ 定义: 图是由顶点集合及顶点间的关系集合组成的一种数据结构. 图的存储结构: 1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图.一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图. 从上面可以看出,无向图的边数组是一

图数据结构(期限、存储结构、遍历)

1.相关条款 顶点(Vertex).弧形(Arc).圆弧头(初始点).圆弧终点(端点).边缘(Edge).向图(Directed graph).无向图(Undigraph).完全图(Completed grapg).导演完全图.稀疏图(Sparse graph).密集图(Dense graph).权(weigh).网(network).无向网.有向网.子图(Subgraph).邻接点(Adjacent).度(Degree).入度(Indegree).出度(Outdegree).路径(path).