# BFS算法的实现

``` 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <vector>
4 #include <queue>
5 using namespace std;  6
7 const int max_dist=9999;  8 const int invalid_p=-1;  9
10 struct adjNode{  11     int node;  12     struct adjNode *next;  13 };  14
15 enum Color{w, g, b};  16
17 struct BFS_struct{  18  Color color;  19     int d;  20     int parent;  21 };  22
23 /*图的矩阵表示向邻接表表示的转换*/
31         for(j=n-1; j>=0; j--){  32             if(*(matrix+i*n+j)== 1){  33                 tempNode=(adjNode *)malloc(sizeof(adjNode));  34                 tempNode->next=adjList[i].next;  35                 tempNode->node=j;  36                 adjList[i].next=tempNode;  37  }  38  }  39  }  40 }  41
42 /*释放邻接表中分配的空间*/
47     for(i=0; i<n; ++i){  48         tempNode=adjList[i].next;  49         while(tempNode != NULL){  50             adjList[i].next=tempNode->next;  51  free(tempNode);  52             tempNode=adjList[i].next;  53  }  54  }  55
59 /*BFS算法*/
60 void BFS(adjNode *adjList, BFS_struct *bfsArray, int s, int n){  61     int i, temp1, temp2;  62     adjNode *tempNode;  63     //vector<int> bfsQueue;
64     queue<int> bfsQueue;  65     for(i=0; i<n; ++i){  66         bfsArray[i].color=w;  67         bfsArray[i].d=max_dist;  68         bfsArray[i].parent=invalid_p;  69  }  70     bfsArray[s].color=g;  71     bfsArray[s].d=0;  72     bfsArray[s].parent=invalid_p;  73
74  bfsQueue.push(s);  75     while(!bfsQueue.empty()){  76        temp1=bfsQueue.front();  77  bfsQueue.pop();  78        tempNode=adjList[temp1].next;  79        while(tempNode != NULL){  80            temp2=tempNode->node;  81            if(bfsArray[temp2].color == w){  82                bfsArray[temp2].color=g;  83                bfsArray[temp2].d=bfsArray[temp1].d+1;  84                bfsArray[temp2].parent=temp1;  85  bfsQueue.push(temp2);  86  }  87
88            tempNode=tempNode->next;  89  }  90
91        bfsArray[temp1].color=b;  92  }  93
94 }  95
96 /*输出BFS学习之后从源节点s到各个节点的最短路径*/
97 void print_path(BFS_struct *bfsArray, int s, int u){  98     if(s == u)  99         printf("%d ", s); 100     else if(bfsArray[u].parent == invalid_p) 101         printf("There is no path form %d to %d", s, u); 102     else{ 103  print_path(bfsArray, s, bfsArray[u].parent); 104         printf("%d ", u); 105  } 106 } 107
108 int main(){ 109     int *matrix; 110     adjNode *adjList, *tempNode; 111     int nodeNum=0, i, j, startpoint=0; 112     BFS_struct *bfsArray; 113
114     printf("Input node number: "); 115     scanf("%d", &nodeNum); 116
120     for(i=0; i<nodeNum; ++i) 121         for(j=0; j<nodeNum; ++j) 122             scanf("%d", matrix+i*nodeNum+j); 123
124     /*以矩阵形式输出图*/
125     printf("matrix: \n"); 126     for(i=0; i<nodeNum; ++i){ 127         for(j=0; j<nodeNum; ++j) 128             printf("%d ", *(matrix+i*nodeNum+j)); 129         printf("\n"); 130  } 131
134     printf("adjacency list: \n"); 135     for(i=0; i<nodeNum; ++i){ 136         printf("node %d:", adjList[i].node); 137         tempNode=adjList[i].next; 138         while(tempNode != NULL){ 139             printf("->%d", tempNode->node); 140             tempNode=tempNode->next; 141  } 142         printf("\n"); 143  } 144
145     printf("Please intput startpoint: "); 146     scanf("%d", &startpoint); 147     bfsArray=(BFS_struct *)malloc(sizeof(BFS_struct)*nodeNum); 148  BFS(adjList, bfsArray, startpoint, nodeNum); 149     for(i=0; i<nodeNum; ++i){ 150         printf("path form %d to %d: ", startpoint, i); 151  print_path(bfsArray, startpoint, i); 152         printf("\n"); 153  } 154
155  free(matrix); 156  free(bfsArray); 157  freeAdjList(adjList, nodeNum); 158     return 0; 159 }```

原文作者：BFS
原文地址: https://www.cnblogs.com/wanghetao/archive/2012/05/12/2497087.html
本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。