zoukankan      html  css  js  c++  java
  • 矩阵图的深度广度遍历

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

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

    图的数据结构

    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("
    ");
     36     DFSTraverse(g1);
     37     printf("
    ");
     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("
    ");
     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("
    ");
     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
    ");
    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 }
    View Code

    运行结果

  • 相关阅读:
    对于CD翻录的一些记录
    暑期实践
    暑期实践
    垃圾处理器-CMS
    离合器半联动点的判断和技巧
    Win10+VS2019+OpenCV环境配置
    C++ 学习资料
    科目二起步原理
    道路交通安全违法行为记分分值分类总结
    NWERC 2020 题解
  • 原文地址:https://www.cnblogs.com/xing901022/p/3538252.html
Copyright © 2011-2022 走看看