// Entry Function
string cycleDetection (vector<vector<int>>& edges, int n, int m)
{
bool visited[n+1] = {false};
vector<int> adjList[n+1];
for (auto edge : edges) { // Build adjacency list from given edges info
adjList[edge[0]].push_back(edge[1]);
adjList[edge[1]].push_back(edge[0]);
}
for (int i = 1; i <= n; i++)
if (!visited[i]) // Consider all disconnected components of a graph.
if (cycleDetectUtilDFS(-1, i, visited, adjList))
return "Yes";
return "No";
}
bool cycleDetectUtilDFS(int parent, int curr, bool visited[], vector<int> adjList[]) {
if (visited[curr]) return true; // Found a cycle
visited[curr] = true;
for (auto connectedNode : adjList[curr])
if (connectedNode != parent // don't go to parent, else u will wrongly think that graph has cycle
&& cycleDetectUtilDFS(curr, connectedNode, visited, adjList))
return true;
return false; // If no cycle found through all connected nodes of curr
}