图的邻接矩阵表示 DFS 和BFS C++实现

这篇博客介绍了如何使用C++实现图的邻接矩阵表示,并提供了深度优先搜索(DFS)和广度优先搜索(BFS)的遍历算法。代码包括创建图、显示图、以及进行DFS和BFS操作。
摘要由CSDN通过智能技术生成
/*
* File name  : graph.cpp
* Function   :   图的学习, 邻接矩阵 深度优先遍历和广度优先遍历        C++实现
* Created on : 2016年5月26日
* Author     : beijiwei@qq.com
* Copyright  : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。
任何单位和个人不经本人允许不得用于商业用途
*/
#include <cstdio>
#include <iostream>
#pragma warning(disable:4996)

using namespace std;

typedef char Vertex_t;
typedef  int Edge_t;
#define MAX 10
#define MVALUE  65535
typedef struct 
{
    Vertex_t    vertex[MAX];
    int  vertex_mark[MAX];
    Edge_t      edge[MAX][MAX];
    int  vertex_num;
    int  edge_num;
}Graph;
/*************************************************************************************************/
typedef struct  {
    int  store[MAX * MAX];
    int head;
    int tail;
}Squeue;

void queue_init(Squeue & Q)
{
    Q.head=0;
    Q.tail=0;
}

void queue_in(Squeue & Q, Vertex_t   V)
{
    if( Q.tail == MAX * MAX )
        cout<<"out of index"<<endl;
    Q.st
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是基于邻接矩阵实现DFSBFS代码: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_VERTEX_NUM 100 typedef struct Graph { int vertex[MAX_VERTEX_NUM]; int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vertex_num; int edge_num; } Graph; typedef struct Queue { int data[MAX_VERTEX_NUM]; int front, rear; } Queue; // 初始化队列 void InitQueue(Queue* queue) { queue->front = queue->rear = 0; } // 判断队列是否为空 bool IsQueueEmpty(Queue* queue) { return queue->front == queue->rear; } // 入队 bool EnQueue(Queue* queue, int x) { if ((queue->rear + 1) % MAX_VERTEX_NUM == queue->front) { return false; } queue->data[queue->rear] = x; queue->rear = (queue->rear + 1) % MAX_VERTEX_NUM; return true; } // 出队 bool DeQueue(Queue* queue, int* x) { if (IsQueueEmpty(queue)) { return false; } *x = queue->data[queue->front]; queue->front = (queue->front + 1) % MAX_VERTEX_NUM; return true; } // 初始化 void InitGraph(Graph* graph) { int i, j; printf("输入顶点数和边数:"); scanf("%d%d", &graph->vertex_num, &graph->edge_num); for (i = 0; i < graph->vertex_num; ++i) { printf("输入第%d个顶点的值:", i); scanf("%d", &graph->vertex[i]); } for (i = 0; i < graph->vertex_num; ++i) { for (j = 0; j < graph->vertex_num; ++j) { graph->matrix[i][j] = 0; } } for (i = 0; i < graph->edge_num; ++i) { int v1, v2; printf("输入第%d条边的起点和终点:", i); scanf("%d%d", &v1, &v2); graph->matrix[v1][v2] = 1; graph->matrix[v2][v1] = 1; } } // DFS遍历 void DFS(Graph* graph, bool* visited, int v) { int i; printf("%d ", graph->vertex[v]); visited[v] = true; for (i = 0; i < graph->vertex_num; ++i) { if (graph->matrix[v][i] == 1 && !visited[i]) { DFS(graph, visited, i); } } } // BFS遍历 void BFS(Graph* graph, bool* visited, Queue* queue, int v) { int i; printf("%d ", graph->vertex[v]); visited[v] = true; EnQueue(queue, v); while (!IsQueueEmpty(queue)) { int u; DeQueue(queue, &u); for (i = 0; i < graph->vertex_num; ++i) { if (graph->matrix[u][i] == 1 && !visited[i]) { printf("%d ", graph->vertex[i]); visited[i] = true; EnQueue(queue, i); } } } } int main() { Graph graph; bool visited[MAX_VERTEX_NUM]; Queue queue; int i; InitGraph(&graph); for (i = 0; i < graph.vertex_num; ++i) { visited[i] = false; } printf("DFS遍历结果:"); for (i = 0; i < graph.vertex_num; ++i) { if (!visited[i]) { DFS(&graph, visited, i); } } printf("\n"); for (i = 0; i < graph.vertex_num; ++i) { visited[i] = false; } InitQueue(&queue); printf("BFS遍历结果:"); for (i = 0; i < graph.vertex_num; ++i) { if (!visited[i]) { BFS(&graph, visited, &queue, i); } } printf("\n"); return 0; } ``` 这里利用邻接矩阵存储结构,实现DFSBFS遍历算法。在程序中,首先通过InitGraph函数读入的顶点数、边数以及每个顶点的值,然后通过邻接矩阵表示的连通关系。DFSBFS遍历时,都需要记录每个节点是否已经被访问过,因此定义了visited数组用于记录。DFS遍历采用递归方式,而BFS遍历则利用队列实现
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值