BFS - 广度优先搜索 - 邻接列表表示法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS - 广度优先搜索 - 邻接列表表示法相关的知识,希望对你有一定的参考价值。

2017-07-25 21:40:22

writer:pprp

在DFS的基础上加上了一个BFS函数

#include <iostream>
#include <queue>

using namespace std;

const int N = 9;

queue<int> qu;

int visited[N] = {0};    //新引入一个数组,用于标记是否访问过

struct node
{
    int vertex;
    node*next;
};

node head[N];

void BFS(int vertex)              // 宽度优先搜素
{
      node*point;
      qu.push(vertex);
      visited[vertex] = 1;
      cout<< vertex <<"->";
      while(!qu.empty())
      {
            vertex = qu.front();
            qu.pop();
            point = head[vertex].next;
            while(point!=NULL)
            {
                  if(visited[point->vertex] == 0)
                  {
                        qu.push(point->vertex);
                        visited[point->vertex] = 1;
                        cout <<point->vertex<<"->";
                  }
                  point = point->next;
            }
      }
}

void create(int val1,int val2)
{
    node*point;
    node*nnew = new node();
    nnew->vertex = val2;
    nnew->next = NULL;
    point = &head[val1];
    while(point->next!=NULL)
    {
        point = point->next;
    }
    point->next = nnew;
}


void print()
{
    node*point;
    for(int i = 0; i < N; i++)
    {
        point = head[i].next;
        cout << "Head["<<i<<"]";
        while(point!=NULL)
        {
            cout <<"-> "<<point->vertex;
            point = point->next;
        }
        cout << endl;
    }
}

int main()
{
    int node1,node2;
    
    for(int i = 0; i < N; i++)
    {
        head[i].vertex = i;
        head[i].next = NULL;
    }
    while(1)
    {
        cout <<"please enter the start point" << endl;

        cin >> node1;
        if(node1 == -1)
            break;
        cout <<"please enter the end point" << endl;
        cin >> node2;

        if(node1 == node2)
            cout <<"自身循环"<<endl;
        else if(node1>=N||node2>=N)
            cout <<"超出范围"<<endl;
        else
            create(node1,node2);
    }

    cout << "邻接表为:" << endl;
    print();
    

    
    cout <<"\n"<<endl;
    
    cout <<"BFS: "<<endl;
    
    BFS(1);

    return 0;
}

 

以上是关于BFS - 广度优先搜索 - 邻接列表表示法的主要内容,如果未能解决你的问题,请参考以下文章

BFS(广度优先搜索)邻接矩阵C ++

广度优先搜索BFS和深度优先搜索DFS

常用的图算法:广度优先(BFS)

图的基本算法(BFS和DFS)

集册 | Java 实现图的广度优先搜索(BFS)算法,一起深度学习算法思维!

SDUT-2124_基于邻接矩阵的广度优先搜索遍历