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

Posted

技术标签:

【中文标题】跟踪图中节点的级别并打印每个节点的级别【英文标题】:Track level of nodes in a graph and print level for each node 【发布时间】:2016-02-13 16:15:15 【问题描述】:

我想使用 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】:

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

复杂度是 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;
              
         
     

【讨论】:

以上是关于跟踪图中节点的级别并打印每个节点的级别的主要内容,如果未能解决你的问题,请参考以下文章

strace命令解析

Linux常用性能工具功能用法及原理

Pygraphviz / networkx 设置节点级别或层

如何将普通二叉树转换为“更智能”的二叉树,其中每个节点都知道其父节点、子节点总数和级别?

二叉树级顺序遍历 LeetCode

跟踪音频(强度级别) - android/iphone