陣列和鄰接表的BFS基礎用法
對於BFS的原理在此處就不在講述,我們直接將具體的例項。
首先是結構為陣列的情況下BFS的使用:
int N = 10000;//隨意大小
int map[N][N] //圖的結構
bool visit[N];//將其初始化為false
void BFS1 (int G[][], int k) //k為你想要遍歷的起點
{
int i , j;
queue Q; //建立一個佇列
cout << k; //訪問kvisited[ k ] = false; //給vk作訪問過標記
Q.push(k);//k進佇列
while ( ! Q.empty () ) { //隊空時搜尋結束i=Q.pop(); //vi出隊
for(j=0; j<N; j++) { //依次搜尋vi的鄰接點 j,此處的搜尋範圍可以看實際的點的數目
if ( G[ i ][ j ] ==1 && !visited[ j ]) { //若j未訪問過
cout << j ;//訪問vj
visited[ j ]=true; //給vj作訪問過標記
Q.push(j) ; //訪問過的vj入隊
}
} //重複檢測 i的所有鄰接頂點
} //外層迴圈,判佇列空否
} // 以vk為出發點時對用鄰接矩陣表示的圖G進行先廣搜尋
接下來是結構為鄰接表的情況:
//首先是資料結構
typedef struct node //邊表結點
{
int adjvex; //鄰接點域(下標)
int cost; //邊上的權值
struct node *next; //下一邊連結指標
} EdgeNode;
typedef struct //頂點表結點
{
int vertex; //頂點資料域
EdgeNode * firstedge;//邊連結串列頭指標
} VertexNode;
typedef struct //圖的鄰接表
{
VertexNode vexlist [N];
int n,e; //頂點個數與邊數
} AdjGraph;
bool visit[n];//n為頂點個數
void BFS1 (AdjGraph *G, int k)//k為遍歷的起點
{
int i;
EdgeNode *p;
queue Q;
cout << G->vexlist[ k ] .vertex;
visit[ k ] = true ;
Q.push(k); //進佇列
while ( !Q.empty()) //隊空搜尋結束
{
i=Q.pop(); //i出隊
p =G->vexlist[ i ].firstedge; //取i的邊表頭指標
while ( p ) //若i的鄰接點j
{
if ( !visit[ p->adjvex ]) //若j未訪問過
{
cout << G->vexlist[ p->adjvex ].vertex; //訪問j
visit[ p->adjvex ]=true; //給j作訪問過標記
Q.push(p->adjvex); //訪問過的j入隊
}
p = p->next; //找vi的下一個鄰接點
} / / 重複檢測 vi的所有鄰接頂點
} //外層迴圈,判佇列空否
}//以k為出發點時對用鄰接表表示的圖G進行先廣搜尋
以上就是BFS在兩種不同的資料結構下的基本使用。