图的广度优先遍历

Posted xiaochi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的广度优先遍历相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int MAXV = 1000;
const int INF = 1000000000; 

//下标代表点,数组元素代表连接的点 
//图的邻接表 
vector<int> Adj[MAXV];
//顶点数 
int n;

//DFS 如果顶点i已经被访问,则vis[i]=true,初始值为false 
bool vis[MAXV] = {false};

//BFS 
bool inq[MAXV] =  { false };

//u:当前访问的顶点编号
//depth为深度 
void DFS(int u,int depth)
{
    //输出,并设置顶点已经被访问 
    cout << u ;
    vis[u] = true;
    
    
    for(int i=0;i<Adj[u].size();i++)
    {
        //与u相接的顶点 
        int v = Adj[u][i];
        //如果没有被访问 
        if(vis[v] == false)
        {
            DFS(v,depth + 1);
        }
    }
 } 
 
 
 
 //测试DFS 
 int main1()
 {
    
    Adj[0].push_back(1);
     Adj[0].push_back(2);
     Adj[1].push_back(0);
     Adj[1].push_back(2);
     Adj[1].push_back(3);
     Adj[1].push_back(4);
     Adj[2].push_back(0);
    Adj[2].push_back(1);
    Adj[2].push_back(4);
    Adj[3].push_back(1);
    Adj[3].push_back(4);
    Adj[3].push_back(5);
    Adj[4].push_back(1);
    Adj[4].push_back(2);
    Adj[4].push_back(3);
    Adj[4].push_back(5);
    Adj[5].push_back(1);
    Adj[5].push_back(4);

    DFS(0,1);
     return 0;
 }
 
 //遍历单个连通块 
 void BFS(int u)
 {
     queue<int> q;
     
     q.push(u);
     
     inq[u] = true;
     
     while(!q.empty())
     {
         int u = q.front();
         cout << u ;
         q.pop();
         
         for(int i=0;i<Adj[u].size();i++)
         {
             int v = Adj[u][i];
             if(inq[v] == false)
             {
                 q.push(v);
                 inq[v] = true;//标记v为已被加入过队列 
             }
         }
    } 
 }
 
 //遍历所有连通量
 void BFSTrave()
 {
     for(int u=0;u<n;u++)
     {
         if(inq[u] == false)
         {
             BFS(u);
         }
     }
  } 
 
 //BFS
int main()
 {
    
    Adj[0].push_back(1);
     Adj[0].push_back(2);
     Adj[1].push_back(0);
     Adj[1].push_back(2);
     Adj[1].push_back(3);
     Adj[1].push_back(4);
     Adj[2].push_back(0);
    Adj[2].push_back(1);
    Adj[2].push_back(4);
    Adj[3].push_back(1);
    Adj[3].push_back(4);
    Adj[3].push_back(5);
    Adj[4].push_back(1);
    Adj[4].push_back(2);
    Adj[4].push_back(3);
    Adj[4].push_back(5);
    Adj[5].push_back(1);
    Adj[5].push_back(4);

    BFS(0);
     return 0;
 }

 题目练习:PAT A1076 Forwards on Weibo

#include <stdio.h>
#include <string.h> 
#include <vector>
#include <queue>
#include <iostream> 
using namespace std;

const int MAXV = 1010;

struct Node
{
    int id;
    int layer;
 };
 
 //邻接表 
 vector<Node> Adj[MAXV];
 //是否被加入过队列 
 bool inq[MAXV] = {false};
 
 //s为起始结点,L为层数上限 
 int BFS(int s,int L)
 {
     int numForward = 0;//转发数
    queue<Node> q; 
    
    Node start;//定义起始结点
    start.id = s;
    start.layer = 0; 
    q.push(start);
    
    inq[start.id] = true;
    
    while(!q.empty())
    {
        //取出队首结点 
        Node topNode = q.front();
        q.pop();
        //取出队首结点的编号 
        int u = topNode.id;
        
        for(int i=0; i < Adj[u].size();i++)
        {
            Node next = Adj[u][i];
            next.layer = topNode.layer + 1;
            //如果next的编号未被加入过队列,且next的层次不超过上限L
            if(inq[next.id] == false && next.layer <= L)
            {
                q.push(next);
                inq[next.id] = true;
                numForward++;//转发数加1 
             } 
         } 
     } 
     
     return numForward; 
 } 
 
 int main()
 {
     Node user;
     //n为人数 L为层数  numFollow为关注的人数  idFollow为关注的人 
     int n,L,numFollow,idFollow;
     
     cin >> n >> L;
     
     for(int i=1;i<=n;i++)
     {
         user.id = i;
         cin >> numFollow;
         
         for(int j=0;j<numFollow;j++)
         {
             cin >> idFollow;
             //下标为点,元素为连接的点 
            Adj[idFollow].push_back(user); 
         }
      } 
      
      //numQuery为查询的个数 
      int numQuery,s; 
      
      cin >> numQuery;
      
      for(int i=0;i<numQuery;i++)
      {
          memset(inq,false,sizeof(inq));
          cin >> s;
          int numForward = BFS(s,L);
          cout << numForward << endl;
      } 
  } 

 

 

以上是关于图的广度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章

图的深度/广度优先遍历C语言程序

数据结构C语言版 图的广度优先遍历和深度优先遍历 急急急 会查重

C语言实现图的广度优先搜索遍历算法

什么是图的深度优先遍历?什么是图的广度优先遍历?

图的广度遍历和深度遍历

图的遍历:深度优先遍历,广度优先遍历