#include #include #include typedef struct { int src; int dest; int weight; } Edge; typedef struct { int parent; int rank; } Subset; int find(Subset subsets[], int i) { if (subsets[i].parent != i) subsets[i].parent = find(subsets, subsets[i].parent); return subsets[i].parent; } void Union(Subset subsets[], int x, int y) { int xroot = find(subsets, x); int yroot = find(subsets, y); if (subsets[xroot].rank < subsets[yroot].rank) subsets[xroot].parent = yroot; else if (subsets[xroot].rank > subsets[yroot].rank) subsets[yroot].parent = xroot; else { subsets[yroot].parent = xroot; subsets[xroot].rank++; } } bool hasCycle(Edge* edges, int V, int E) { Subset* subsets = (Subset*)malloc(V * sizeof(Subset)); for (int v = 0; v < V; v++) { subsets[v].parent = v; subsets[v].rank = 0; } for (int e = 0; e < E; e++) { int x = find(subsets, edges[e].src); int y = find(subsets, edges[e].dest); if (x == y) { free(subsets); return true; } Union(subsets, x, y); } free(subsets); return false; } int main() { int V = 3; // Number of vertices int E = 3; // Number of edges Edge edges[E]; // Array of edges // Edge 0-1 with weight 5 edges[0].src = 0; edges[0].dest = 1; edges[0].weight = 5; // Edge 1-2 with weight 3 edges[1].src = 1; edges[1].dest = 2; edges[1].weight = 3; // Edge 0-2 with weight 1 edges[2].src = 0; edges[2].dest = 2; edges[2].weight = 1; // Check for a cycle if (hasCycle(edges, V, E)) { printf("YES\n"); } else { printf("NO\n"); } return 0; }