#include<bits/stdc++.h>
Using BFS Approach
bool Bfs(int vertex, vector<int> adj[], vector<int> &visited){
queue<pair<int, int>> q;
q.push({vertex, -1});
while(!q.empty()){
int node = q.front().first;
int parent = q.front().second;
q.pop();
for(auto it : adj[node]){
if(parent == it){
continue;
}
if(visited[it]){
return true;
}
visited[it] = 1;
q.push({it, node});
}
}
return false;
}
string cycleDetection (vector<vector<int>>& edges, int n, int m)
{
vector<int> adj[n+1];
for(int i=0; i<m; i++){
int u = edges[i][0];
int v = edges[i][1];
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> visited(n+1, 0);
for(int i=0; i<visited.size(); i++){
if(!visited[i]){
if(Bfs(i, adj, visited)){
return "Yes";
}
}
}
return "No";
}
// Using DFS Approach
bool Dfs(int node, int parent, vector<int> adj[], vector<int> &visited){
visited[node] = 1;
for(auto it : adj[node]){
if(parent == it){
continue;
}
if(visited[it]){
return true;
}
if(Dfs(it, node, adj, visited)){
return true;
}
}
return false;
}
string cycleDetection (vector<vector<int>>& edges, int n, int m)
{
vector<int> adj[n+1];
for(int i=0; i<m; i++){
int u = edges[i][0];
int v = edges[i][1];
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> visited(n+1, 0);
for(int i=0; i<visited.size(); i++){
if(!visited[i]){
if(Dfs(i, -1, adj, visited)){
return "Yes";
}
}
}
return "No";
}