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;
+ }
+}