圖的廣度優先遍歷BFS實現--鄰接矩陣p143


源程序:

#include <stdio.h>   

#include <stdlib.h>  

#define MAXSIZE 9 /* 存儲空間初始分配量 */

const int vnum = 20;

typedef struct gp

{

char vexs[vnum]; /* 頂點表 */

int arc[vnum][vnum];/* 鄰接矩陣,可看作邊表 */

int vexnum, arcnum; /* 圖中當前的頂點數和邊數 */

}Graph;

 

/* 循環隊列的順序存儲結構 */

typedef struct

{

int data[MAXSIZE];

int front;    /* 頭指針 */

int rear; /* 尾指針,若隊列不空,指向隊列尾元素的下一個位置 */

}Queue;

 

/* 初始化一個空隊列Q */

int InitQueue(Queue *Q)

{

Q->front = 0;

Q->rear = 0;

return  1;

}

 

/* 若隊列Q為空隊列,則返回TRUE,否則返回FALSE */

int QueueEmpty(Queue Q)

{

if (Q.front == Q.rear) /* 隊列空的標志 */

return 1;

else

return 0;

}

 

/* 若隊列未滿,則插入元素e為Q新的隊尾元素 */

int EnQueue(Queue *Q, int e)

{

if ((Q->rear + 1) % MAXSIZE == Q->front) /* 隊列滿的判斷 */

return 0;

Q->data[Q->rear] = e; /* 將元素e賦值給隊尾 */

Q->rear = (Q->rear + 1) % MAXSIZE;/* rear指針向后移一位置, */

  /* 若到最后則轉到數組頭部 */

return  1;

}

 

/* 若隊列不空,則刪除Q中隊頭元素,用e返回其值 */

int OutQueue(Queue *Q, int *e)

{

if (Q->front == Q->rear) /* 隊列空的判斷 */

return 0;

*e = Q->data[Q->front]; /* 將隊頭元素賦值給e */

Q->front = (Q->front + 1) % MAXSIZE; /* front指針向后移一位置, */

/* 若到最后則轉到數組頭部 */

return  1;

}

 

void CreateGraph(Graph *G)

{

int i, j;

 

G->arcnum = 6;

G->vexnum = 5;

 

/* 讀入頂點信息,建立頂點表 */

G->vexs[0] = 'A';

G->vexs[1] = 'B';

G->vexs[2] = 'C';

G->vexs[3] = 'D';

G->vexs[4] = 'E';

//G->vexs[5] = 'F';

//G->vexs[6] = 'G';

//G->vexs[7] = 'H';

//G->vexs[8] = 'I';

 

 

for (i = 0; i < G->vexnum; i++)/* 初始化圖 */

{

for (j = 0; j < G->vexnum; j++)

{

G->arc[i][j] = 0;

}

}

 

G->arc[0][1] = 1;

G->arc[0][3] = 1;

G->arc[0][4] = 1;

 

G->arc[1][0] = 1;

G->arc[1][2] = 1;

 

G->arc[2][1] = 1;

G->arc[2][3] = 1;

G->arc[2][4] = 1;

 

G->arc[3][0] = 1;

G->arc[3][2] = 1;

 

G->arc[4][0] = 1;

G->arc[4][2] = 1;

 

for (i = 0; i < G->vexnum; i++)

{

for (j = i; j < G->vexnum; j++)

{

G->arc[j][i] = G->arc[i][j];

}

}

 

}

 

int visited[vnum]; /* 訪問標志的數組 */

/* 鄰接矩陣的廣度遍歷算法 */

void BFS(Graph G)

{

int i, j;

Queue Q;

for (i = 0; i < G.vexnum; i++)

visited[i] = 0;

InitQueue(&Q); /* 初始化一輔助用的隊列 */

for (i = 0; i < G.vexnum; i++)  /* 如果是連通圖則只有一次循環,因為一次循環下來后visit都為TRUE*/

{

if (!visited[i]) /* 若是未訪問過就處理 */

{

visited[i] = 1; /* 設置當前頂點訪問過 */

printf("%c ", G.vexs[i]);/* 打印頂點,也可以其它操作 */

EnQueue(&Q, i); /* 將此頂點入隊列 */

while (!QueueEmpty(Q)) /* 若當前隊列不為空 */

{

OutQueue(&Q, &i); /* 將隊對元素出隊列,賦值給i */

for (j = 0; j<G.vexnum; j++)

{

/* 判斷其它頂點若與當前頂點存在邊且未訪問過  */

if (G.arc[i][j] == 1 && !visited[j])

{

visited[j] = 1; /* 將找到的此頂點標記為已訪問 */

printf("%c ", G.vexs[j]); /* 打印頂點 */

EnQueue(&Q, j); /* 將找到的此頂點入隊列  */

}

}

}

}

}

}

 

int main(void)

{

Graph g;

Graph *pg = &g;

CreateGraph(pg);

//printf("\n深度遍歷:");

//DFSTraverse(G);

printf("\n廣度遍歷:");

BFS(g);

system("pause");

return 0;

}

 運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM