diff --git a/checkstyle.xml b/checkstyle.xml index d78724455af7..316563c3b5a0 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -155,7 +155,7 @@ - + @@ -175,7 +175,7 @@ - + diff --git a/src/main/java/com/thealgorithms/datastructures/graphs/EdmondsAlgorithm.java b/src/main/java/com/thealgorithms/datastructures/graphs/EdmondsAlgorithm.java new file mode 100644 index 000000000000..35f8042fea63 --- /dev/null +++ b/src/main/java/com/thealgorithms/datastructures/graphs/EdmondsAlgorithm.java @@ -0,0 +1,73 @@ +package edmonds; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class EdmondsAlgorithm { + + // Class to represent edges in the graph + static class Edge { + int u; + int v; + int weight; + + Edge(int u, int v, int weight) { + this.u = u; + this.v = v; + this.weight = weight; + } + } + + // Implementation of Edmonds' Algorithm + public static int maxWeightMatching(List edges, int n) { + // The number of nodes in the graph + int[] match = new int[n]; + Arrays.fill(match, -1); // no match + + // Perform the algorithm + int result = 0; + boolean[] visited = new boolean[n]; + for (int i = 0; i < n; i++) { + Arrays.fill(visited, false); + if (augmentPath(i, edges, match, visited)) { + result++; + } + } + + return result; + } + + // Augmenting path search using DFS + private static boolean augmentPath(int u, List edges, int[] match, boolean[] visited) { + for (Edge edge : edges) { + if (edge.u == u || edge.v == u) { + int v = (edge.u == u) ? edge.v : edge.u; + if (!visited[v]) { + visited[v] = true; + + if (match[v] == -1 || augmentPath(match[v], edges, match, visited)) { + match[u] = v; + match[v] = u; + return true; + } + } + } + } + return false; + } + + public static void main(String[] args) { + // Input for testing + List edges = new ArrayList<>(); + edges.add(new Edge(0, 1, 10)); + edges.add(new Edge(1, 2, 15)); + edges.add(new Edge(0, 2, 20)); + edges.add(new Edge(2, 3, 25)); + edges.add(new Edge(3, 4, 30)); + + int n = 5; // Number of vertices + + System.out.println("Maximum weight matching: " + maxWeightMatching(edges, n)); + } +} diff --git a/src/main/java/com/thealgorithms/misc/FourSumProblem.java b/src/main/java/com/thealgorithms/misc/FourSumProblem.java new file mode 100644 index 000000000000..3a23304a0d78 --- /dev/null +++ b/src/main/java/com/thealgorithms/misc/FourSumProblem.java @@ -0,0 +1,58 @@ +package com.thealgorithms.misc; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class FourSumProblem { + + public static List> fourSum(int[] nums, int target) { + List> result = new ArrayList<>(); + + if (nums == null || nums.length < 4) { + return result; // if array is too small to have 4 numbers, return empty result + } + + // Sort the array first + Arrays.sort(nums); + + // Iterate through the array, fixing the first two elements + for (int i = 0; i < nums.length - 3; i++) { + if (i > 0 && nums[i] == nums[i - 1]) continue; // Skip duplicates for the first element + + for (int j = i + 1; j < nums.length - 2; j++) { + if (j > i + 1 && nums[j] == nums[j - 1]) continue; // Skip duplicates for the second element + + // Use two pointers for the remaining two elements + int left = j + 1; + int right = nums.length - 1; + + while (left < right) { + int sum = nums[i] + nums[j] + nums[left] + nums[right]; + + if (sum == target) { + // If we found a quadruplet, add it to the result list + result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right])); + + // Skip duplicates for the third element + while (left < right && nums[left] == nums[left + 1]) left++; + // Skip duplicates for the fourth element + while (left < right && nums[right] == nums[right - 1]) right--; + + // Move the pointers + left++; + right--; + } else if (sum < target) { + // If the sum is less than the target, move the left pointer to increase the sum + left++; + } else { + // If the sum is greater than the target, move the right pointer to decrease the sum + right--; + } + } + } + } + + return result; + } +}