矩陣圖的深度廣度遍歷

圖的經常使用表示方法就是矩陣和鄰接表。數據結構

矩陣一般使用與規整的,且數據量較小的圖,這種圖直觀上方便的表示出了圖之間節點的相互關係。ide

圖的數據結構

typedef struct Graph_Matrix{ char vers[NUM]; //存儲數據表示
    int arc[NUM][NUM];//二維矩陣圖,用來表示節點相連狀況
    int numVer,numEdge;//頂點數,和邊數
}Graph_Matrix;

矩陣圖的深度優先遍歷

爲了防止圖中有不連通的子圖,所以每一個節點順序的遍歷一次,每次採用深度優先遍歷其聯通子圖,避免了遺漏節點。spa

有點相似書中遍歷玩父節點,直接遍歷他的左邊孩子,而後再回來....code

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); } }

矩陣圖的廣度優先遍歷

廣度優先遍歷,主要依賴於一個隊列,每次遍歷一個父節點,尋找他的子節點一次放入隊列中,遍歷完,讀取隊列中的隊頭,在此讀取其子節點,有點相似樹中遍歷父節點後,在遍歷他的孩子節點。blog

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 }
View Code

運行結果

相關文章
相關標籤/搜索