跟踪图表中的节点级别和每个节点的打印级别

时间:2016-02-13 16:15:15

标签: c++ algorithm graph shortest-path breadth-first-search

我想使用BFS算法遍历图形,并希望按其级别跟踪节点。 这是我的代码。

#include<iostream>
#include<queue>
#include<vector>
#include<stdlib.h>
using namespace std;
int main()
{
    int edges,a,b;
    vector<int>nodes[1000];
    cout<<"Enter the no of edges"<<endl;
    cin>>edges;
    for(int i=0; i<edges; i++)
    {
        cin>>a>>b;
        nodes[a].push_back(b);
        nodes[b].push_back(a);
    }

    cout<<endl;
    queue<int> que;
//initially que is empty
    bool visited[1000];
    int level[1000];
// mark all the vertices as not visited
    for(int i=0; i<1000; i++)
    {
        visited[i]=false;
    }
    int start;
    cout<<"\nEnter the starting node"<<endl;
    cin>>start;

//insert the starting node into the queue
    que.push(start);
    level[start]=1;
//mark the starting node as visited
    visited[start]=true;


    cout<<"\nBFS Traversal\n";

    while(!que.empty())
    {
        //Dequeue a vertex from que and print it
        int front = que.front();
        cout<<front<<" ";
        que.pop();
        // get all adjacent vertices of the dequeued vertex s
        // If an adjacent vertex has not been visited,
        //then mark it as visited
        // and enqueue it
        for(vector<int>::iterator it=nodes[front].begin();
                it!=nodes[front].end(); ++it)
        {

            if(visited[*it]==false)
            {
                visited[*it]=true;
                que.push(*it);
            }
        }
       // cout<<endl;
    }
    cout<<endl;
    int Sz = sizeof(level)/sizeof(int);
    /*for(int i=0;i<=edges;i++)
    {
        cout<<"Level of "<<i<<"is "<<level[10]<<endl;
    }*/
    return 0;
}

[请注意代码末尾的注释部分。我尝试了一些方法但失败了。我删除了那些跟踪。请帮我更新代码。]

1 个答案:

答案 0 :(得分:0)

您可以使用此功能查找树中每个节点的级别。

复杂性是O(n),因为我们访问每个节点一次。

最好的运气

#define ll long long int
ll level[100005],arr[100005];
vector <ll> adj[100005];

void bfs(ll s)
{
     ll vis[100005];
     memset(vis,false,sizeof vis);
     queue <ll> q;
     q.push(s);
     level[s] = 1;
     vis[s] = true;

     while(!q.empty())
     {
         ll p = q.front();
         //cout<<p<<endl;
         q.pop();

         vector <ll>::iterator it;
         for(it=adj[p].begin();it!=adj[p].end();++it)
         {
              if(vis[*it] == false)
              {
                  level[*it] = level[p] + 1;
                  q.push(*it);
                  vis[*it] = true;
              }
         }
     }
}