/**
* 这里使用邻接矩阵表示一个无向连通图。
*/
#include <iostream>
#include <queue>
using namespace std;
#define LEN 10
#define INFINITE 100
#define NIL -1
bool m[LEN][LEN];
enum COLOR {WHITE, GRAY, BLACK};
COLOR color[LEN];
int d[LEN];
int p[LEN];
//广度优先遍历算法, 借助一个队列+着色标记实现
void BFS(int s){
int i;
for(i=0;i<LEN;++i){
color[i] = WHITE;
d[i] = INFINITE;
p[i] = NIL;
}
color[s] = GRAY;
d[s] = 0;
p[s] = NIL;
queue<int> Q;
Q.push(s);
while(!Q.empty()){
int u = Q.front();
cout<<u<<endl;
Q.pop();
//Access all vertices next to u
int j;
for(j=0;j<LEN;++j){
if(m[u][j] == true){
if(color[j] == WHITE){
color[j] = GRAY;
d[j] = d[u] + 1;
p[j] = u;
Q.push(j);
}
}
}
color[u] = BLACK;
}
}
int main(){
int i,j;
for(i=0;i<LEN;++i){
for(j=0;j<LEN;++j){
m[i][j] = false;
}
}
m[0][2] = true; m[2][0] = true;
m[1][7] = true; m[7][1] = true;
m[2][7] = true; m[7][2] = true;
m[2][4] = true; m[4][2] = true;
m[7][3] = true; m[3][7] = true;
m[3][4] = true; m[4][3] = true;
m[4][5] = true; m[5][4] = true;
m[5][8] = true; m[8][5] = true;
m[8][6] = true; m[6][8] = true;
m[8][9] = true; m[9][8] = true;
BFS(0);
return 0;
}