mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-12-19 07:00:35 +08:00
Add Maximum Weighted Matching Algorithm for Trees (#6184)
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
package com.thealgorithms.dynamicprogramming;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.thealgorithms.datastructures.graphs.UndirectedAdjacencyListGraph;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class TreeMatchingTest {
|
||||
UndirectedAdjacencyListGraph graph;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
graph = new UndirectedAdjacencyListGraph();
|
||||
for (int i = 0; i < 14; i++) {
|
||||
graph.addNode();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testMaxMatchingForGeneralTree() {
|
||||
graph.addEdge(0, 1, 20);
|
||||
graph.addEdge(0, 2, 30);
|
||||
graph.addEdge(1, 3, 40);
|
||||
graph.addEdge(1, 4, 10);
|
||||
graph.addEdge(2, 5, 20);
|
||||
graph.addEdge(3, 6, 30);
|
||||
graph.addEdge(3, 7, 30);
|
||||
graph.addEdge(5, 8, 40);
|
||||
graph.addEdge(5, 9, 10);
|
||||
|
||||
TreeMatching treeMatching = new TreeMatching(graph);
|
||||
assertEquals(110, treeMatching.getMaxMatching(0, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testMaxMatchingForBalancedTree() {
|
||||
graph.addEdge(0, 1, 20);
|
||||
graph.addEdge(0, 2, 30);
|
||||
graph.addEdge(0, 3, 40);
|
||||
graph.addEdge(1, 4, 10);
|
||||
graph.addEdge(1, 5, 20);
|
||||
graph.addEdge(2, 6, 20);
|
||||
graph.addEdge(3, 7, 30);
|
||||
graph.addEdge(5, 8, 10);
|
||||
graph.addEdge(5, 9, 20);
|
||||
graph.addEdge(7, 10, 10);
|
||||
graph.addEdge(7, 11, 10);
|
||||
graph.addEdge(7, 12, 5);
|
||||
TreeMatching treeMatching = new TreeMatching(graph);
|
||||
assertEquals(100, treeMatching.getMaxMatching(0, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testMaxMatchingForTreeWithVariedEdgeWeights() {
|
||||
graph.addEdge(0, 1, 20);
|
||||
graph.addEdge(0, 2, 30);
|
||||
graph.addEdge(0, 3, 40);
|
||||
graph.addEdge(0, 4, 50);
|
||||
graph.addEdge(1, 5, 20);
|
||||
graph.addEdge(2, 6, 20);
|
||||
graph.addEdge(3, 7, 30);
|
||||
graph.addEdge(5, 8, 10);
|
||||
graph.addEdge(5, 9, 20);
|
||||
graph.addEdge(7, 10, 10);
|
||||
graph.addEdge(4, 11, 50);
|
||||
graph.addEdge(4, 12, 20);
|
||||
TreeMatching treeMatching = new TreeMatching(graph);
|
||||
assertEquals(140, treeMatching.getMaxMatching(0, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void emptyTree() {
|
||||
TreeMatching treeMatching = new TreeMatching(graph);
|
||||
assertEquals(0, treeMatching.getMaxMatching(0, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSingleNodeTree() {
|
||||
UndirectedAdjacencyListGraph singleNodeGraph = new UndirectedAdjacencyListGraph();
|
||||
singleNodeGraph.addNode();
|
||||
|
||||
TreeMatching treeMatching = new TreeMatching(singleNodeGraph);
|
||||
assertEquals(0, treeMatching.getMaxMatching(0, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testLinearTree() {
|
||||
graph.addEdge(0, 1, 10);
|
||||
graph.addEdge(1, 2, 20);
|
||||
graph.addEdge(2, 3, 30);
|
||||
graph.addEdge(3, 4, 40);
|
||||
|
||||
TreeMatching treeMatching = new TreeMatching(graph);
|
||||
assertEquals(60, treeMatching.getMaxMatching(0, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testStarShapedTree() {
|
||||
graph.addEdge(0, 1, 15);
|
||||
graph.addEdge(0, 2, 25);
|
||||
graph.addEdge(0, 3, 35);
|
||||
graph.addEdge(0, 4, 45);
|
||||
|
||||
TreeMatching treeMatching = new TreeMatching(graph);
|
||||
assertEquals(45, treeMatching.getMaxMatching(0, -1));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testUnbalancedTree() {
|
||||
graph.addEdge(0, 1, 10);
|
||||
graph.addEdge(0, 2, 20);
|
||||
graph.addEdge(1, 3, 30);
|
||||
graph.addEdge(2, 4, 40);
|
||||
graph.addEdge(4, 5, 50);
|
||||
|
||||
TreeMatching treeMatching = new TreeMatching(graph);
|
||||
assertEquals(100, treeMatching.getMaxMatching(0, -1));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user