We will be given a connected graph with N vertices M edges. So we have to print the lexicographically smallest BFS of the graph starting from 1.
Lexicographically means in order starting from the given point till the end point is found.
Vertices should be numbered from 1 to N
Example
Input: N = 5 M = 5 edges(1,4, arr) edges(3,4, arr) edges(5,4, arr) edges(3,2, arr) edges(1,5, arr) Output: 1 4 3 2 5
Instead of doing a normal BFS traversal with a simple queue on the graph, we can use a priority queue(min heap). Whenever a node is visited add its adjacent nodes into the priority queue. Every time, we visit a new node, it will be the one with the smallest index in the priority queue. Print the nodes when every time we visit them starting from 1.
Algorithm
Start Step 1 -> Declare Function void lexo(vector<int> array[], int n) Declare bool arr[n + 1] Call memset(arr, 0, sizeof arr) Use STL priority_queue<int, vector<int>, greater<int> > que Set arr[1] = true Call que.push(1) Loop While !que.empty() Declare int now = que.top() Call que.pop() Print now Loop For (auto p : array[now]) IF !arr[p] Call que.push(p) Call arr[p] = true End End End Step 2 -> declare Function void edge(int i, int j, vector<int> ar[]) Call ar[i].push_back(j) Call ar[j].push_back(i) Step 3- > In main() Declare int n = 5, m = 5 Use STL vector<int> arr[n + 1] Call edges(1,4, arr) Call edges(3,4, arr) Call lexo(arr, n) Stop
Example
#include <bits/stdc++.h> using namespace std; //for finding the graph void lexo(vector<int> array[], int n){ bool arr[n + 1]; memset(arr, 0, sizeof arr); priority_queue<int, vector<int>, greater<int> > que; arr[1] = true; que.push(1); while (!que.empty()){ int now = que.top(); que.pop(); cout << now << " "; for (auto p : array[now]){ if (!arr[p]){ que.push(p); arr[p] = true; } } } } //for generating edge void edge(int i, int j, vector<int> ar[]){ ar[i].push_back(j); ar[j].push_back(i); } int main(){ int n = 5, m = 5; vector<int> arr[n + 1]; edges(1,4, arr); //for inserting the edge edges(3,4, arr); edges(5,4, arr); edges(3,2 arr); edges(1,5, arr); lexo(arr, n); return 0; }
Output
if we run above program then it will generate following output
1 4 3 2 5