C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析_C 语言

本文实例讲述了C++实现图的邻接矩阵存储和广度、深度优先遍历的方法。分享给大家供大家参考。具体如下:

示例:建立如图所示的无向图

由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边.
示例输入(按照这个格式输入):

5
6
abcde
0 1 1
0 2 1
0 3 1
2 3 1
2 4 1
1 4 1

输入结束(此行不必输入)

注:0 1 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a->b所示
      0 2 1表示该图的第0个顶点和第2个定点有边相连,如上图中的a->c所示
      2 3 1表示该图的第2个顶点和第3个定点有边相连,如上图中的c->d所示

实现代码如下:

#include <stdio.h>
#define MAX_GRAPH 100
#define MAX_QUEUE 30
typedef struct
{
 char vex[MAX_GRAPH]; /* 顶点 */
 int edge[MAX_GRAPH][MAX_GRAPH]; /* 邻接矩阵 */
 int n; /* 当前的顶点数 */
 int e; /* 当前的边数 */
}GRAPH;
void Create(GRAPH *G); /* 图的邻接矩阵表示法 */
void BFS(GRAPH *G,int k); /* 广度优先遍历 */
void DFS(GRAPH *G,int k); /* 深度优先遍历 */
int visited[MAX_GRAPH];
int main(int argc, char *argv[])
{
 int i;
 for(i = 0 ; i < MAX_QUEUE ; ++i)
  visited[i] = 0;
 GRAPH G;
 Create(&G);
/* BFS(&G,0);*/
 DFS(&G,0);

 return 0;
}
void BFS(GRAPH *G,int k)
{
 int queue[MAX_QUEUE]; /* 队列 */
 int front = -1,rear = -1,amount = 0;
 int visited[MAX_GRAPH]; /* 标记已经访问过的元素 */
 int i,j;

 for(i = 0 ; i < MAX_GRAPH ; ++i)
  visited[i] = 0;

 printf("访问顶点%c\n",G->vex[k]);
 visited[k] = 1;

 rear = (rear + 1) % MAX_QUEUE; /* 入队操作 */
 queue[rear] = k;
 front = rear;
 ++amount;

 while(amount > 0)
 {
  i = queue[front]; /* 出队操作 */
  front = (front + 1) % MAX_QUEUE;
  --amount;

  for(j = 0 ; j < G->n ; ++j)
  {
   if(G->edge[i][j] != 0 && visited[j] == 0)
   {
    printf("访问顶点%c\n",G->vex[j]);
    visited[j] = 1;

    rear = (rear + 1) % MAX_QUEUE; /* 入队 */
    queue[rear] = j;
    ++amount;
   }
  }
 }
 printf("遍历结束\n");
}
void DFS(GRAPH *G,int k)
{
 int j;
 printf("访问顶点:%c\n",G->vex[k]);
 visited[k] = 1;

 for(j = 0 ; j < G->n ; ++j)
 {
  if(G->edge[k][j] != 0 && visited[j] == 0)
   DFS(G,j);
 }
}
void Create(GRAPH *G)
{
 printf("输入顶点数:\n");
 scanf("%d",&G->n);
 printf("输入边数:\n");
 scanf("%d",&G->e);

 getchar();

 int i,j,k,w;
 printf("请输入端点(char型):\n");
 for(i = 0 ; i < G->n ; ++i) /* 建立表头 */
  scanf("%c",&G->vex[i]);

 for(i = 0 ; i < G->n ; ++i) /* 初始化邻接矩阵 */
  for(j = 0 ; j < G->n ; ++j)
   G->edge[i][j] = 0;

 printf("请输入边:\n");
 for(k = 0 ; k < G->e ; ++k)
 {
  scanf("%d%d%d",&i,&j,&w); /* 输入(vi,vj)上的权w */
  G->edge[i][j] = w;
  G->edge[j][i] = w;
 }
}

希望本文所述对大家的C++程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 遍历
, 存储
, 图
, 广度优先
, 邻接矩阵
深度优先
邻接矩阵广度优先遍历、邻接表的广度优先遍历、邻接表广度优先遍历、邻接表深度优先遍历、邻接表的深度优先遍历,以便于您获取更多的相关知识。

时间: 2024-11-06 07:30:09

C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析_C 语言的相关文章

C++实现图的邻接表存储和广度优先遍历实例分析_C 语言

本文实例讲述了C++实现图的邻接表存储和广度优先遍历方法.分享给大家供大家参考.具体如下: 示例:建立如图所示的无向图 由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边. 示例输入(按照这个格式输入): 5 6 abcde 0 1 0 2 0 3 2 3 2 4 1 4 输入结束(此行不必输入) 注:0 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a->b所示       0 2表示该图的第0个顶点和第2个定点有边相连,如上图中的a->c所示       2 3表示该图的

数据结构例程——图的邻接矩阵存储结构及算法

本文是[数据结构基础系列(7):图]中第4课时[图的邻接矩阵存储结构及算法]的例程. #include <stdio.h> #include <malloc.h> #define MAXV 100 /*最大顶点数设为100*/ #define LIMITLESS 9999 typedef struct { int no; //顶点编号 char info[20]; //顶点其他信息,类型视应用而定 } VertexType; //顶点类型 typedef struct //图的定义

解析C++的线性表链式存储设计与相关的API实现_C 语言

基本概念链式存储定义: 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点: 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息. 数据结点: 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息. 尾结点: 链表中的最后一个数据结点,其下一元素指针为空,表示无后继. 链表技术领域推演 链表链式存储_api实现分析: 在C语言中可以用结构体来定义链表中的指针域,链表中的表头结点也可以用

C语言 存储类详解及示例代码_C 语言

C 存储类 存储类定义 C 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C 程序中可用的存储类: auto register static extern auto 存储类 auto 存储类是所有局部变量默认的存储类. { int mount; auto int month; } 上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量. register 存储类 register 存储类用于定义存储在寄存器

错误:sem_union的存储大小未知问题的解决方法_C 语言

今天在编译代码的时候提示 错误: 'sem_union'的存储大小未知 问题原因:在新版2.6内核中关于union sem_union 这个联合体已经被注释了,需要自己写这个联合体. 解决方案:在C文件中先定义: union semun { int val; struct semid_ds *buf; unsigned short *array; }sem_union; 随后编译时它就能找到预先定义好的sem_union联合体了. Linux下编译时出现的错误及解决方法 (1)由于是Linux新

判断给定的图是不是有向无环图实例代码_C 语言

复制代码 代码如下: #include<iostream>#include<list>#include<stack>using namespace std; class Graph { int vertexNum; list<int> *adjacents;public: Graph(int _vertexNum) {  vertexNum = _vertexNum;  adjacents = new list<int>[vertexNum]; 

深度优先遍历DFS用邻接表表示的图

深度优先遍历用邻接表表示的图 DFS the Adjacency List Graph eryar@163.com 一.简介 创建了图之后,我们希望从图中某个顶点出发访遍图中其余顶点,且使每个顶点仅被访问一次.这一过程就是图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓朴排序和求解关键路径等算法的基础. 深度优先搜索(Depth First Search)是一种递归的遍历方法.其过程为从图中任意一顶点出发,访问与其相连接的未被访问的顶点.因此,遍历图的过程实质上

c语言-关于数据结构的简单问题完整算法 C语言 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号

问题描述 关于数据结构的简单问题完整算法 C语言 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号 急急急紧急急急急急急急急急急急急急急急急急急急急急急 解决方案 先是存储结构后是伪代码,你想要算法就看注释吧~ Typedef struct Node { Char vex; //顶点 Int degree; //度数 }Node; Node ArrDegree[m]; //m+1为顶点个数 For(i =0; i ArrDeg

C#语言中如何用邻接矩阵法表示图,并且遍历图?数据结构中图的遍历用C#的实现?

问题描述 C#语言中如何用邻接矩阵法表示图,并且遍历图?数据结构中图的遍历用C#的实现? C#语言中如何用邻接矩阵法表示图,并且遍历图?数据结构中图的遍历用C#的实现? 解决方案 http://download.csdn.net/download/yejinfu/2463153