矩阵图的深度广度遍历

图的常用表示方法就是矩阵和邻接表。

矩阵通常使用与规整的,且数据量较小的图,这种图直观上方便的表示出了图之间节点的相互关系。

图的数据结构

typedef struct Graph_Matrix{
    char vers[NUM]; //存储数据表示
    int arc[NUM][NUM];//二维矩阵图,用来表示节点相连情况
    int numVer,numEdge;//顶点数,和边数
}Graph_Matrix;

矩阵图的深度优先遍历

为了防止图中有不连通的子图,因此每个节点顺序的遍历一次,每次采用深度优先遍历其联通子图,避免了遗漏节点。

有点类似书中遍历玩父节点,直接遍历他的左边孩子,然后再回来....

int DFS(Graph_Matrix *g,int i){
    int j;
    visited[i] = 1;
    printf("%c ",g->vers[i]);
    for(j=0;j<g->numVer;j++){
        if(g->arc[i][j] == 1 && !visited[j])
            DFS(g,j);
    }
}
void DFSTraverse(Graph_Matrix *g){
    int i;
    for(i=0;i<g->numVer;i++)
        visited[i] = 0;
    for(i=0;i<g->numVer;i++){
        if(!visited[i])
            DFS(g,i);
    }
}

矩阵图的广度优先遍历

广度优先遍历,主要依赖于一个队列,每次遍历一个父节点,寻找他的子节点一次放入队列中,遍历完,读取队列中的队头,在此读取其子节点,有点类似树中遍历父节点后,在遍历他的孩子节点。

void BFSTraverse(Graph_Matrix *g){
    int i,j;
    Queue *q = (Queue *)malloc(sizeof(Queue));
    for(i=0;i<g->numVer;i++)
        visited[i] = 0;
    initQueue(q,0);
    for(i=0;i<g->numVer;i++){
        if(!visited[i]){
            visited[i] = 1;
            printf("%c ",g->vers[i]);
            inQueue(q,i);
            while(getLength(q)){
                int *tar = (int *)malloc(sizeof(int));
                outQueue(q,tar);
                for(j=0;j<g->numVer;j++){
                    if(g->arc[*tar][j] == 1 &&  !visited[j]){
                        visited[j] = 1;
                        printf("%c ",g->vers[j]);
                        inQueue(q,j);
                    }
                }
            }
        }
    }
}

示例图

示例代码

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define NUM 5
  4 #define MAXSIZE NUM
  5 typedef struct Graph_Matrix{
  6     char vers[NUM];
  7     int arc[NUM][NUM];
  8     int numVer,numEdge;
  9 }Graph_Matrix;
 10
 11 typedef struct Queue{
 12     int data[NUM];
 13     int front;
 14     int rear;
 15 }Queue;
 16
 17 void initQueue(Queue *q,int n);
 18 void showQueue(Queue *q);
 19 int getLength(Queue *q);
 20 int inQueue(Queue *q,int num);
 21 int outQueue(Queue *q,int *tar);
 22
 23 void createGraph(Graph_Matrix *g);
 24 void showGraph(Graph_Matrix *g);
 25 int visited[NUM];
 26 int DFS(Graph_Matrix *g,int i);
 27 void DFSTraverse(Graph_Matrix *g);
 28 void BFSTraverse(Graph_Matrix *g);
 29
 30 int main()
 31 {
 32     Graph_Matrix * g1 = (Graph_Matrix *)malloc(sizeof(Graph_Matrix));
 33     createGraph(g1);
 34     showGraph(g1);
 35     printf("\n");
 36     DFSTraverse(g1);
 37     printf("\n");
 38     BFSTraverse(g1);
 39     return 0;
 40 }
 41
 42 void createGraph(Graph_Matrix *g){
 43     int i;
 44     int j;
 45     g->numEdge = 0;
 46     for(i=0;i<NUM;i++){
 47         g->vers[i] = 65+i;
 48     }
 49     for(i=0;i<NUM;i++){
 50         for(j=0;j<NUM;j++){
 51             if(i != j){
 52                 g->arc[i][j] = 1;
 53                 g->numEdge++;
 54             }
 55             else
 56                 g->arc[i][j] = 0;
 57         }
 58     }
 59     g->arc[2][3] = g->arc[3][2] = 0;
 60     g->arc[1][2] = g->arc[2][1] = 0;
 61     g->numEdge -= 4;
 62     g->numEdge = g->numEdge/2;
 63     g->numVer = 5;
 64 }
 65 void showGraph(Graph_Matrix *g){
 66     int i,j;
 67     for(i=0;i<g->numVer;i++){
 68         printf("%c ",g->vers[i]);
 69     }
 70     printf("\n");
 71
 72     for(i=0;i<g->numVer;i++){
 73         for(j=0;j<g->numVer;j++){
 74             printf("%d ",g->arc[i][j]);
 75         }
 76         printf("\n");
 77     }
 78     printf("vertexes:%d edges:%d",g->numVer,g->numEdge);
 79 }
 80
 81 int DFS(Graph_Matrix *g,int i){
 82     int j;
 83     visited[i] = 1;
 84     printf("%c ",g->vers[i]);
 85     for(j=0;j<g->numVer;j++){
 86         if(g->arc[i][j] == 1 && !visited[j])
 87             DFS(g,j);
 88     }
 89 }
 90 void DFSTraverse(Graph_Matrix *g){
 91     int i;
 92     for(i=0;i<g->numVer;i++)
 93         visited[i] = 0;
 94     for(i=0;i<g->numVer;i++){
 95         if(!visited[i]) //如果是连通图,只会执行一次
 96             DFS(g,i);
 97     }
 98 }
 99
100 void BFSTraverse(Graph_Matrix *g){
101     int i,j;
102     Queue *q = (Queue *)malloc(sizeof(Queue));
103     for(i=0;i<g->numVer;i++)
104         visited[i] = 0;
105     initQueue(q,0);
106     for(i=0;i<g->numVer;i++){
107         if(!visited[i]){
108             visited[i] = 1;
109             printf("%c ",g->vers[i]);
110             inQueue(q,i);
111             while(getLength(q)){
112                 int *tar = (int *)malloc(sizeof(int));
113                 outQueue(q,tar);
114                 for(j=0;j<g->numVer;j++){
115                     if(g->arc[*tar][j] == 1 &&  !visited[j]){
116                         visited[j] = 1;
117                         printf("%c ",g->vers[j]);
118                         inQueue(q,j);
119                     }
120                 }
121             }
122         }
123     }
124 }
125
126 void initQueue(Queue *q,int n){
127     int i;
128     q->front=0;
129     q->rear =0;
130     for(i=0;i<n;i++){
131         q->data[q->rear]=2*i+1;
132         q->rear++;
133     }
134 }
135 void showQueue(Queue *q){
136     int i;
137     int len=getLength(q);
138     printf("front-");
139     for(i=0;i<len;i++){
140         if(q->front+i<MAXSIZE)
141             printf("%d-",q->data[q->front+i]);
142         else
143             printf("%d-",q->data[q->front+i-MAXSIZE]);
144     }
145     printf("rear\n");
146 }
147 int getLength(Queue *q){
148     return (q->rear-q->front+MAXSIZE)%MAXSIZE;
149 }
150 int inQueue(Queue *q,int num){
151     if((q->rear+1)%MAXSIZE == q->front)
152         return 0;
153     q->data[q->rear] = num;
154     q->rear = (q->rear+1)%MAXSIZE;
155     return 1;
156 }
157 int outQueue(Queue *q,int *tar){
158     if(q->front == q->rear)
159         return 0;
160     *tar = q->data[q->front];
161     q->front = (q->front+1)%MAXSIZE;
162     return 1;
163 }

运行结果

本文转自博客园xingoo的博客,原文链接:矩阵图的深度广度遍历,如需转载请自行联系原博主。

时间: 2024-10-03 15:13:01

矩阵图的深度广度遍历的相关文章

邻接图的深度广度优先遍历

邻接图的优点就是,现用现申请,空间存储很灵活,并且需要的空间也很小.我们在做复杂网络时,通常也是用这种方法.缺点是不适合并行化,因为cuda只支持连续地址空间的拷贝. 数据结构 主要包括,边节点和顶点节点 typedef struct edgeNode{ int num; int weight; struct edgeNode * next; }edgeNode; typedef struct vertexNode{ char data; edgeNode * firstNode; }verte

用java建立无向图,然后进行深度和广度遍历,下列的代码怎么改

问题描述 用java建立无向图,然后进行深度和广度遍历,下列的代码怎么改 import java.util.LinkedList;import java.util.Queue;class MatrixUDG { static int vlen; int elen; int[][] mMatrix; char[] mVexs; private int number = 7; private boolean[] flag; int[][] edges; MatrixUDG(char[] vexs c

求一个数据结构代码 要有注释 关于图的深度遍历的 要求必修用C语言做出

问题描述 求一个数据结构代码 要有注释 关于图的深度遍历的 要求必修用C语言做出 要求用数据结构 代码后面要有注释 底下的要求一个也不能漏 图的DFS遍历 要求: 1) 先任意创建一个图: 2) 图的DFS的递归和非递归算法的实现 3) 要求用邻接矩阵.邻接表两种结构存储实现 解决方案 http://zhidao.baidu.com/link?url=54LjtF_eA5Ppp2_FHcYL6q32Zhv1-gTcjAcHmXrHyddryApBeq-meV8z40RuGPEfqMxSGGKE6

邻接矩阵(以顶点为中心),比较稀疏时,采用邻接表;图的两种遍历

对于边比较稠密的图,可以采用邻接矩阵(以顶点为中心)的方式表示,而边比较稀疏时,采用邻接表的结构更合适.两种都不能直观表达哪两个点相连或者最短路径是什么. 深度优先遍历类似于树的先根序遍历.与树不同的是,它需要对已经访问过的节点添加标记以免被重复遍历. public class Depth { /** * 对k号节点深度遍历 * @param a * @param color * @param k 节点 */ public static void depthTraversal(int[][] a

【D3.js 学习总结】16、D3布局-矩阵图

d3.layout.treemap() 矩阵图(Treemap)的API说明 treemap.children - 取得或设置孩子访问器. treemap.links - 计算树节点中的父子链接. treemap.mode - 改变布局的算法. treemap.nodes - 计算矩形树布局并返回节点数组. treemap.padding - 指定父子之间的间距. treemap.round - 启用或者禁用四舍五入像素值. treemap.size - 指定布局的尺寸. treemap.sor

【算法导论】图的广度优先搜索遍历(BFS)

       图的存储方法:邻接矩阵.邻接表        例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表:         邻接表存储方法是一种顺序存储与链式存储相结合的存储方法.在这种方法中,只考虑非零元素,所以在图中的顶点很多而边很少时,可以节省存储空间.         邻接表存储结构由两部分组成:对于每个顶点vi, 使用一个具有两个域的结构体数组来存储,这个数组称为顶

【算法导论】图的深度优先搜索遍历(DFS)

        关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS).         深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点,依次类推,尽可能向纵深方向搜索,所以称为深度优先搜索遍历.显然这种搜索方法具有递归的性质.图的BFS和树的搜索遍历很类似,只是其存储方式不同.         其基本思想为:从图中某一顶点vi出发,访问此顶点,并进行标记,然后依次搜索vi的每个邻接点vj:若vj未被访

矩阵图法

矩阵图法就是从多维问题的事件中,找出成对的因素,排列成矩阵图,然后根据矩阵图来分析问题,确定关键点的方法,它是一种通过多因素综合思考,探索问题的好方法.在复杂的质量问题中,往往存在许多成对的质量因素,将这些成对因素找出来,分别排列成行和列,其交点就是其相互关联的程度,在此基础上再找出存在的问题及问题的形态,从而找到解决问题的思路.矩阵图的形式如下图所示,A为某一个因素群,a1.a2.a3.a4.-是属于A这个因素群的具体因素,将它们排列成行:B为另一个因素群,b1.b2.b3.b4.-为属于B这

图的深度遍历

#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>int visited[10];/*访问标志数组*/typedef struct ArcCell{ int adj;/*顶点关系类型,用1表示相邻,0表示不相邻*/}ArcCell,**AdjMatrix;/*邻接矩阵*/typedef struct type{  char data[3];/*顶点值*/ struct