1. 程式人生 > >陣列和鄰接表的BFS基礎用法

陣列和鄰接表的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; //訪問k

visited[ 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在兩種不同的資料結構下的基本使用。