前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >矩阵图的深度广度遍历

矩阵图的深度广度遍历

作者头像
用户1154259
发布2018-01-17 19:06:08
5710
发布2018-01-17 19:06:08
举报

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

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

图的数据结构

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

矩阵图的深度优先遍历

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

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

代码语言:javascript
复制
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);
    }
}

矩阵图的广度优先遍历

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

代码语言:javascript
复制
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);
                    }
                }
            }
        }
    }
}

示例图

示例代码

代码语言:javascript
复制
  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 }

运行结果

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-02-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图的数据结构
  • 矩阵图的深度优先遍历
  • 矩阵图的广度优先遍历
  • 示例图
  • 示例代码
  • 运行结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档