Given a graph G, the task is to check if it represents a Ring Topology.
A Ring Topology is the one shown in the image below:
Examples:
Input : Graph =
Output : YES Input : Graph =
Output : NO
A graph of V vertices represents a Ring topology if it satisfies the following three conditions:
- Number of vertices >= 3.
- All vertices should have degree 2.
- No of edges = No of Vertices.
The idea is to traverse the graph and check if it satisfies the above three conditions. If yes, then it represents a Ring Topology otherwise not.
Below is the implementation of the above approach:
C++
// C++ program to check if the given graph// represents a Ring 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 graphvoid 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 Ring topology else return false */bool checkRingTopologyUtil(vector<int> adj[], int V, int E){ // Number of edges should be equal // to Number of vertices if (E != V) return false; // For a graph to represent a ring topology should have // greater than 2 nodes if (V <= 2) return false; 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 stores the count of // the vertices having degree 2 int countDegree2 = 0; for (int i = 1; i <= V; i++) { if (vertexDegree[i] == 2) { countDegree2++; } } // if all three necessary conditions as discussed, // satisfy return true if (countDegree2 == V) { return true; } else { return false; }}// Function to check if the graph represents a Ring topologyvoid checkRingTopology(vector<int> adj[], int V, int E){ bool isRing = checkRingTopologyUtil(adj, V, E); if (isRing) { cout << "YES" << endl; } else { cout << "NO" << endl; }}// Driver codeint main(){ // Graph 1 int V = 6, E = 6; vector<int> adj1[V + 1]; addEdge(adj1, 1, 2); addEdge(adj1, 2, 3); addEdge(adj1, 3, 4); addEdge(adj1, 4, 5); addEdge(adj1, 6, 1); addEdge(adj1, 5, 6); checkRingTopology(adj1, V, E); // Graph 2 V = 5, E = 4; vector<int> adj2[V + 1]; addEdge(adj2, 1, 2); addEdge(adj2, 1, 3); addEdge(adj2, 3, 4); addEdge(adj2, 4, 5); checkRingTopology(adj2, V, E); return 0;} |
Java
// Java program to check if the given graph// represents a Ring topologyimport java.util.*;class GFG{// A utility function to add an edge in an// undirected graph.static void addEdge(Vector<Integer> adj[], int u, int v){ adj[u].add(v); adj[v].add(u);}// A utility function to print the adjacency list// representation of graphstatic void printGraph(Vector<Integer> adj[], int V){ for(int v = 0; v < V; ++v) { System.out.print("\n Adjacency list of vertex " + v + "\n head "); for(int x : adj[v]) System.out.print(". " + x); System.out.printf("\n"); }}// Function to return true if the graph represented // by the adjacency list represents a Ring topology // else return false static boolean checkRingTopologyUtil(Vector<Integer> adj[], int V, int E){ // Number of edges should be equal // to Number of vertices if (E != V) return false; // For a graph to represent a ring // topology should have greater // than 2 nodes if (V <= 2) return false; int[] vertexDegree = new int[V + 1]; // Calculate the degree of each vertex for(int i = 1; i <= V; i++) { for(int v : adj[i]) { vertexDegree[v]++; } } // countDegree2 stores the count of // the vertices having degree 2 int countDegree2 = 0; for(int i = 1; i <= V; i++) { if (vertexDegree[i] == 2) { countDegree2++; } } // If all three necessary conditions // as discussed, satisfy return true if (countDegree2 == V) { return true; } else { return false; }}// Function to check if the graph represents// a Ring topologystatic void checkRingTopology(Vector<Integer> adj[], int V, int E){ boolean isRing = checkRingTopologyUtil(adj, V, E); if (isRing) { System.out.print("YES" + "\n"); } else { System.out.print("NO" + "\n"); }}// Driver codepublic static void main(String[] args){ // Graph 1 int V = 6, E = 6; @SuppressWarnings("unchecked") Vector<Integer> []adj1 = new Vector[V + 1]; for(int i = 0; i < adj1.length; i++) adj1[i] = new Vector<Integer>(); addEdge(adj1, 1, 2); addEdge(adj1, 2, 3); addEdge(adj1, 3, 4); addEdge(adj1, 4, 5); addEdge(adj1, 6, 1); addEdge(adj1, 5, 6); checkRingTopology(adj1, V, E); // Graph 2 V = 5; E = 4; @SuppressWarnings("unchecked") Vector<Integer> []adj2 = new Vector[V + 1]; for(int i = 0; i < adj2.length; i++) adj2[i] = new Vector<Integer>(); addEdge(adj2, 1, 2); addEdge(adj2, 1, 3); addEdge(adj2, 3, 4); addEdge(adj2, 4, 5); checkRingTopology(adj2, V, E);}}// This code is contributed by Amit Katiyar |
Python3
# Python3 program to check if the given graph# represents a star topology# A utility function to add an edge in an# undirected graph.def addEdge(adj, u, v): adj[u].append(v) adj[v].append(u)# A utility function to print the adjacency list# representation of graphdef printGraph(adj, V): for v in range(V): print("Adjacency list of vertex ",v,"\n head ") for x in adj[v]: print("-> ",x,end=" ") printf()# /* Function to return true if the graph represented# by the adjacency list represents a ring topology# else return false */def checkRingTopologyUtil(adj, V, E): # Number of edges should be equal # to (Number of vertices - 1) if (E != (V)): return False # For a graph to represent a ring topology should have # greater than 2 nodes if (V <= 2): return False vertexDegree = [0]*(V + 1) # calculate the degree of each vertex for i in range(V+1): for v in adj[i]: vertexDegree[v] += 1 # countDegree2 stores the count of # the vertices having degree 2 countDegree2 = 0 for i in range(1, V + 1): if (vertexDegree[i] == 2): countDegree2 += 1 # if all three necessary conditions as discussed, # satisfy return true if (countDegree2 == V): return True else: return False# Function to check if the graph represents a ring topologydef checkRingTopology(adj, V, E): isRing = checkRingTopologyUtil(adj, V, E) if (isRing): print("YES") else: print("NO" )# Driver code# Graph 1V,E = 6,6adj1 = [[] for i in range(V + 1)]addEdge(adj1, 1, 2)addEdge(adj1, 2, 3)addEdge(adj1, 3, 4)addEdge(adj1, 4, 5)addEdge(adj1, 6, 1)addEdge(adj1, 5, 6)checkRingTopology(adj1, V, E)# Graph 2V,E = 5,4adj2 = [[] for i in range(V + 1)]addEdge(adj2, 1, 2)addEdge(adj2, 1, 3)addEdge(adj2, 3, 4)addEdge(adj2, 4, 2)checkRingTopology(adj2, V, E)# This code is contributed by mohit kumar 29 |
C#
// C# program to check if the given graph// represents a Ring topologyusing System;using System.Collections.Generic;class GFG{ // A utility function to add an edge in an // undirected graph. static void addEdge(List<List<int>> adj, int u, int v ) { adj[u].Add(v); adj[v].Add(u); } // A utility function to print the adjacency list // representation of graph static void printGraph(List<List<int>> adj, int V) { for(int v = 0; v < V; ++v) { Console.Write("\n Adjacency list of vertex " + v + "\n head "); foreach(int x in adj[v]) { Console.Write(". " + x); } Console.WriteLine(); } } // Function to return true if the graph represented // by the adjacency list represents a Ring topology // else return false static bool checkRingTopologyUtil(List<List<int>> adj, int V, int E) { // Number of edges should be equal // to Number of vertices if (E != V) return false; // For a graph to represent a ring // topology should have greater // than 2 nodes if (V <= 2) return false; int[] vertexDegree = new int[V + 1]; // Calculate the degree of each vertex for(int i = 1; i <= V; i++) { foreach(int v in adj[i]) { vertexDegree[v]++; } } // countDegree2 stores the count of // the vertices having degree 2 int countDegree2 = 0; for(int i = 1; i <= V; i++) { if (vertexDegree[i] == 2) { countDegree2++; } } // If all three necessary conditions // as discussed, satisfy return true if (countDegree2 == V) { return true; } else { return false; } } // Function to check if the graph represents // a Ring topology static void checkRingTopology(List<List<int>> adj, int V, int E) { bool isRing = checkRingTopologyUtil(adj, V, E); if (isRing) { Console.Write("YES" + "\n"); } else { Console.Write("NO" + "\n"); } } // Driver code static public void Main () { // Graph 1 int V = 6, E = 6; List<List<int>> adj1 = new List<List<int>>(); for(int i = 0; i < V + 1; i++) { adj1.Add(new List<int>() ); } addEdge(adj1, 1, 2); addEdge(adj1, 2, 3); addEdge(adj1, 3, 4); addEdge(adj1, 4, 5); addEdge(adj1, 6, 1); addEdge(adj1, 5, 6); checkRingTopology(adj1, V, E); // Graph 2 V = 6; E = 6; List<List<int>> adj2 = new List<List<int>>(); for(int i = 0; i < V + 1; i++) { adj2.Add(new List<int>() ); } addEdge(adj2, 1, 2); addEdge(adj2, 1, 3); addEdge(adj2, 3, 4); addEdge(adj2, 4, 5); checkRingTopology(adj2, V, E); }}// This code is contributed by avanitrachhadiya2155 |
Javascript
<script>// JavaScript program to check if the given graph// represents a Ring topology // A utility function to add an edge in an // undirected graph.function addEdge(adj,u,v){ adj[u].push(v); adj[v].push(u);} // A utility function to print the adjacency list // representation of graphfunction printGraph(adj,V){ for (let v = 0; v < V; ++v) { document.write("\n Adjacency list of vertex " + v + "\n head "); for (let x=0;x<adj[v].length;x++) { document.write( "-> " + adj[v][x]); } document.write("<br>"); }}/* Function to return true if the graph represented by the adjacency list represents a Ring topology else return false */function checkRingTopologyUtil(adj,V,E){ // Number of edges should be equal // to (Number of vertices - 1) if (E != V) { return false; } // a single node is termed as a bus topology if (V <= 2) { return false; } let vertexDegree = new Array(V + 1); for(let i=0;i<vertexDegree.length;i++) { vertexDegree[i]=0; } // calculate the degree of each vertex for (let i = 1; i <= V; i++) { for (let v=0;v<adj[i].length;v++) { vertexDegree[adj[i][v]]++; } } // countDegree2 stores the count of // the vertices having degree 2 let countDegree2 = 0; for (let i = 1; i <= V; i++) { if (vertexDegree[i] == 2) { countDegree2++; } } // If all three necessary conditions // as discussed, satisfy return true if (countDegree2 == V) { return true; } else { return false; } }// Function to check if the graph represents a Ring topologyfunction checkRingTopology(adj,V,E){ let isRing = checkRingTopologyUtil(adj, V, E); if (isRing) { document.write("YES<br>"); } else { document.write("NO<br>"); }}// Driver code// Graph 1 let V = 6, E = 6; let adj1=[]; for(let i = 0; i < V + 1; i++) { adj1.push([]); } addEdge(adj1, 1, 2); addEdge(adj1, 2, 3); addEdge(adj1, 3, 4); addEdge(adj1, 4, 5); addEdge(adj1, 6, 1); addEdge(adj1, 5, 6); checkRingTopology(adj1, V, E); // Graph 2 V = 5; E = 4; let adj2 = []; for(let i = 0; i < (V + 1); i++) { adj2.push([]); } addEdge(adj2, 1, 2); addEdge(adj2, 1, 3); addEdge(adj2, 3, 4); addEdge(adj2, 4, 2); checkRingTopology(adj2, V, E);// This code is contributed by patel2127</script> |
YES NO
Complexity Analysis:
- Time Complexity: O(V + E) where V and E are the numbers of vertices and edges in the graph respectively.
- Auxiliary Space: O(V + E).
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

