Check if the given graph represents a Bus Topology

Given a graph G, check if it represents a Bus Topology.

A Bus Topology is the one shown in the image below:

Examples:

Input: 

Output:  YES

Input: 

Output:  NO


A graph of V vertices represents a bus topology if it satisfies the following two conditions:

  1. Each node except the stating end ending ones have degree 2 while the starting and ending have degree 1.
  2. No of edges = No of Vertices – 1.

The idea is to traverse the graph and check if it satisfies the above two conditions. If yes, then it represents a Bus Topology.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to check if the given graph
// represents a bus topology
#include <bits/stdc++.h>
using namespace std;
  
// A utility function to add an edge in an
// undirected graph.
void addEdge(vector<int> adj[], int u, int v)
{
    adj[u].push_back(v);
    adj[v].push_back(u);
}
  
// A utility function to print the adjacency list
// representation of graph
void printGraph(vector<int> adj[], int V)
{
    for (int v = 0; v < V; ++v) {
        cout << "\n Adjacency list of vertex "
             << v << "\n head ";
        for (auto x : adj[v])
            cout << "-> " << x;
        printf("\n");
    }
}
  
/* Function to return true if the graph represented
   by the adjacency list represents a bus topology
   else return false */
bool checkBusTopologyUtil(vector<int> adj[], int V, int E)
{
  
    // Number of edges should be equal
    // to (Number of vertices - 1)
    if (E != (V - 1))
        return false;
  
    // a single node is termed as a bus topology
    if (V == 1)
        return true;
  
    int* vertexDegree = new int[V + 1];
    memset(vertexDegree, 0, sizeof vertexDegree);
  
    // calculate the degree of each vertex
    for (int i = 1; i <= V; i++) {
        for (auto v : adj[i]) {
            vertexDegree[v]++;
        }
    }
  
    // countDegree2 - number of vertices with degree 2
    // countDegree1 - number of vertices with degree 1
    int countDegree2 = 0, countDegree1 = 0;
    for (int i = 1; i <= V; i++) {
        if (vertexDegree[i] == 2) {
            countDegree2++;
        }
        else if (vertexDegree[i] == 1) {
            countDegree1++;
        }
        else {
            // if any node has degree other
            // than 1 or 2, it is
            // NOT a bus topology
            return false;
        }
    }
  
    // if both necessary conditions as discussed,
    // satisfy return true
    if (countDegree1 == 2 && countDegree2 == (V - 2)) {
        return true;
    }
    return false;
}
  
// Function to check if the graph represents a bus topology
void checkBusTopology(vector<int> adj[], int V, int E)
{
    bool isBus = checkBusTopologyUtil(adj, V, E);
    if (isBus) {
        cout << "YES" << endl;
    }
    else {
        cout << "NO" << endl;
    }
}
  
// Driver code
int main()
{
    // Graph 1
    int V = 5, E = 4;
    vector<int> adj1[V + 1];
    addEdge(adj1, 1, 2);
    addEdge(adj1, 1, 3);
    addEdge(adj1, 3, 4);
    addEdge(adj1, 4, 5);
    checkBusTopology(adj1, V, E);
  
    // Graph 2
    V = 4, E = 4;
    vector<int> adj2[V + 1];
    addEdge(adj2, 1, 2);
    addEdge(adj2, 1, 3);
    addEdge(adj2, 3, 4);
    addEdge(adj2, 4, 2);
    checkBusTopology(adj2, V, E);
  
    return 0;
}

chevron_right


Output:

YES
NO

Time Complexity : O(E), where E is the number of Edges in the graph.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.