@graphty/algorithms 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +490 -336
- package/dist/algorithms.d.ts +42 -2
- package/dist/algorithms.js +11099 -2
- package/dist/algorithms.js.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.d.ts +4 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +124 -170
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.d.ts +26 -1
- package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +56 -149
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +3 -3
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +39 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js +286 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts +80 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js +294 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
- package/dist/src/algorithms/centrality/index.d.ts +2 -0
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +1 -0
- package/dist/src/algorithms/centrality/index.js.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.d.ts +17 -0
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +45 -0
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.js +47 -54
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
- package/dist/src/algorithms/community/index.d.ts +2 -0
- package/dist/src/algorithms/community/index.d.ts.map +1 -1
- package/dist/src/algorithms/community/index.js.map +1 -1
- package/dist/src/algorithms/community/label-propagation.d.ts +13 -3
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
- package/dist/src/algorithms/community/label-propagation.js +50 -35
- package/dist/src/algorithms/community/label-propagation.js.map +1 -1
- package/dist/src/algorithms/community/leiden.d.ts +3 -2
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
- package/dist/src/algorithms/community/leiden.js +34 -39
- package/dist/src/algorithms/community/leiden.js.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.d.ts +112 -0
- package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
- package/dist/src/algorithms/community/louvain-optimized.js +303 -0
- package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
- package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
- package/dist/src/algorithms/community/louvain.js +17 -76
- package/dist/src/algorithms/community/louvain.js.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.d.ts +59 -0
- package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
- package/dist/src/algorithms/community/modularity-utils.js +112 -0
- package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
- package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
- package/dist/src/algorithms/matching/bipartite.js +8 -40
- package/dist/src/algorithms/matching/bipartite.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.js +1 -12
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +37 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +193 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts +5 -2
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +15 -14
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.d.ts +29 -0
- package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-unified.js +333 -0
- package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts +54 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.js +368 -0
- package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs.d.ts +4 -18
- package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +5 -182
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/benchmark-all-algorithms.d.ts +23 -0
- package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
- package/dist/src/benchmark-all-algorithms.js +462 -0
- package/dist/src/benchmark-all-algorithms.js.map +1 -0
- package/dist/src/clustering/hierarchical.d.ts +16 -15
- package/dist/src/clustering/hierarchical.d.ts.map +1 -1
- package/dist/src/clustering/hierarchical.js +209 -223
- package/dist/src/clustering/hierarchical.js.map +1 -1
- package/dist/src/clustering/index.d.ts +4 -2
- package/dist/src/clustering/index.d.ts.map +1 -1
- package/dist/src/clustering/index.js +2 -2
- package/dist/src/clustering/index.js.map +1 -1
- package/dist/src/clustering/k-core.d.ts +16 -15
- package/dist/src/clustering/k-core.d.ts.map +1 -1
- package/dist/src/clustering/k-core.js +57 -21
- package/dist/src/clustering/k-core.js.map +1 -1
- package/dist/src/clustering/spectral.d.ts +8 -0
- package/dist/src/clustering/spectral.d.ts.map +1 -1
- package/dist/src/clustering/spectral.js +40 -21
- package/dist/src/clustering/spectral.js.map +1 -1
- package/dist/src/core/graph.js +4 -4
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/flow/ford-fulkerson.d.ts +17 -11
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
- package/dist/src/flow/ford-fulkerson.js +141 -217
- package/dist/src/flow/ford-fulkerson.js.map +1 -1
- package/dist/src/flow/min-cut.d.ts +6 -5
- package/dist/src/flow/min-cut.d.ts.map +1 -1
- package/dist/src/flow/min-cut.js +17 -8
- package/dist/src/flow/min-cut.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
- package/dist/src/link-prediction/adamic-adar.js +17 -26
- package/dist/src/link-prediction/adamic-adar.js.map +1 -1
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
- package/dist/src/link-prediction/common-neighbors.js +7 -11
- package/dist/src/link-prediction/common-neighbors.js.map +1 -1
- package/dist/src/optimized/bit-packed.d.ts +143 -0
- package/dist/src/optimized/bit-packed.d.ts.map +1 -0
- package/dist/src/optimized/bit-packed.js +292 -0
- package/dist/src/optimized/bit-packed.js.map +1 -0
- package/dist/src/optimized/csr-graph.d.ts +86 -0
- package/dist/src/optimized/csr-graph.d.ts.map +1 -0
- package/dist/src/optimized/csr-graph.js +341 -0
- package/dist/src/optimized/csr-graph.js.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts +74 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.js +223 -0
- package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
- package/dist/src/optimized/graph-adapter.d.ts +62 -0
- package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
- package/dist/src/optimized/graph-adapter.js +146 -0
- package/dist/src/optimized/graph-adapter.js.map +1 -0
- package/dist/src/optimized/index.d.ts +14 -0
- package/dist/src/optimized/index.d.ts.map +1 -0
- package/dist/src/optimized/index.js +28 -0
- package/dist/src/optimized/index.js.map +1 -0
- package/dist/src/research/grsbm.d.ts.map +1 -1
- package/dist/src/research/grsbm.js +6 -14
- package/dist/src/research/grsbm.js.map +1 -1
- package/dist/src/research/sync.d.ts.map +1 -1
- package/dist/src/research/sync.js +3 -29
- package/dist/src/research/sync.js.map +1 -1
- package/dist/src/research/terahac.d.ts +2 -0
- package/dist/src/research/terahac.d.ts.map +1 -1
- package/dist/src/research/terahac.js +7 -3
- package/dist/src/research/terahac.js.map +1 -1
- package/dist/src/types/index.d.ts +8 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/algorithm-utilities.d.ts +2 -0
- package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
- package/dist/src/utils/algorithm-utilities.js +2 -0
- package/dist/src/utils/algorithm-utilities.js.map +1 -0
- package/dist/src/utils/graph-converters.d.ts +79 -0
- package/dist/src/utils/graph-converters.d.ts.map +1 -0
- package/dist/src/utils/graph-converters.js +196 -0
- package/dist/src/utils/graph-converters.js.map +1 -0
- package/dist/src/utils/graph-utilities.d.ts +62 -0
- package/dist/src/utils/graph-utilities.d.ts.map +1 -0
- package/dist/src/utils/graph-utilities.js +148 -0
- package/dist/src/utils/graph-utilities.js.map +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/math-utilities.d.ts +52 -0
- package/dist/src/utils/math-utilities.d.ts.map +1 -0
- package/dist/src/utils/math-utilities.js +123 -0
- package/dist/src/utils/math-utilities.js.map +1 -0
- package/dist/src/utils/matrix-utilities.d.ts +2 -0
- package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
- package/dist/src/utils/matrix-utilities.js +2 -0
- package/dist/src/utils/matrix-utilities.js.map +1 -0
- package/dist/src/utils/optimization-helpers.d.ts +33 -0
- package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
- package/dist/src/utils/optimization-helpers.js +47 -0
- package/dist/src/utils/optimization-helpers.js.map +1 -0
- package/package.json +18 -3
- package/src/algorithms/centrality/betweenness.ts +167 -199
- package/src/algorithms/centrality/closeness.ts +73 -191
- package/src/algorithms/centrality/degree.ts +3 -3
- package/src/algorithms/centrality/delta-pagerank-simple.ts +366 -0
- package/src/algorithms/centrality/delta-pagerank.ts +435 -0
- package/src/algorithms/centrality/index.ts +2 -0
- package/src/algorithms/centrality/pagerank.ts +66 -0
- package/src/algorithms/community/girvan-newman.ts +52 -59
- package/src/algorithms/community/index.ts +2 -0
- package/src/algorithms/community/label-propagation.ts +64 -35
- package/src/algorithms/community/leiden.ts +40 -41
- package/src/algorithms/community/louvain-optimized.ts +445 -0
- package/src/algorithms/community/louvain.ts +24 -104
- package/src/algorithms/community/modularity-utils.ts +146 -0
- package/src/algorithms/matching/bipartite.ts +8 -44
- package/src/algorithms/shortest-path/bellman-ford.ts +1 -14
- package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
- package/src/algorithms/shortest-path/dijkstra.ts +17 -15
- package/src/algorithms/traversal/bfs-unified.ts +433 -0
- package/src/algorithms/traversal/bfs-variants.ts +496 -0
- package/src/algorithms/traversal/bfs.ts +10 -228
- package/src/benchmark-all-algorithms.ts +548 -0
- package/src/clustering/hierarchical.ts +241 -251
- package/src/clustering/index.ts +4 -2
- package/src/clustering/k-core.ts +87 -39
- package/src/clustering/spectral.ts +44 -20
- package/src/core/graph.ts +4 -4
- package/src/flow/ford-fulkerson.ts +186 -254
- package/src/flow/min-cut.ts +21 -11
- package/src/index.ts +6 -0
- package/src/link-prediction/adamic-adar.ts +17 -30
- package/src/link-prediction/common-neighbors.ts +7 -16
- package/src/optimized/bit-packed.ts +340 -0
- package/src/optimized/csr-graph.ts +455 -0
- package/src/optimized/direction-optimized-bfs.ts +291 -0
- package/src/optimized/graph-adapter.ts +200 -0
- package/src/optimized/index.ts +36 -0
- package/src/research/grsbm.ts +7 -16
- package/src/research/sync.ts +3 -32
- package/src/research/terahac.ts +10 -2
- package/src/types/index.ts +8 -0
- package/src/utils/algorithm-utilities.ts +2 -0
- package/src/utils/graph-converters.ts +241 -0
- package/src/utils/graph-utilities.ts +199 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/math-utilities.ts +140 -0
- package/src/utils/matrix-utilities.ts +2 -0
- package/src/utils/optimization-helpers.ts +81 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Graph } from "../core/graph.js";
|
|
1
2
|
/**
|
|
2
3
|
* Ford-Fulkerson Algorithm for Maximum Flow
|
|
3
4
|
*
|
|
@@ -23,10 +24,18 @@ export interface MaxFlowResult {
|
|
|
23
24
|
edges: [string, string][];
|
|
24
25
|
};
|
|
25
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Utility function to create a flow network for bipartite matching
|
|
29
|
+
*/
|
|
30
|
+
export declare function createBipartiteFlowNetwork(leftNodes: string[], rightNodes: string[], edges: [string, string][]): {
|
|
31
|
+
graph: Map<string, Map<string, number>>;
|
|
32
|
+
source: string;
|
|
33
|
+
sink: string;
|
|
34
|
+
};
|
|
26
35
|
/**
|
|
27
36
|
* Ford-Fulkerson algorithm using DFS for finding augmenting paths
|
|
28
37
|
*
|
|
29
|
-
* @param graph - Adjacency list representation with capacities
|
|
38
|
+
* @param graph - Adjacency list representation with capacities - accepts Graph class or Map
|
|
30
39
|
* @param source - Source node
|
|
31
40
|
* @param sink - Sink node
|
|
32
41
|
* @returns Maximum flow value and flow graph
|
|
@@ -34,20 +43,17 @@ export interface MaxFlowResult {
|
|
|
34
43
|
* Time Complexity: O(E * f) where f is the maximum flow
|
|
35
44
|
* Space Complexity: O(V + E)
|
|
36
45
|
*/
|
|
37
|
-
export declare function fordFulkerson(graph:
|
|
46
|
+
export declare function fordFulkerson(graph: Graph, source: string, sink: string): MaxFlowResult;
|
|
38
47
|
/**
|
|
39
48
|
* Edmonds-Karp algorithm (Ford-Fulkerson with BFS)
|
|
40
49
|
* More efficient implementation with better time complexity
|
|
41
50
|
*
|
|
51
|
+
* @param graph - Adjacency list representation with capacities - accepts Graph class or Map
|
|
52
|
+
* @param source - Source node
|
|
53
|
+
* @param sink - Sink node
|
|
54
|
+
* @returns Maximum flow value and flow graph
|
|
55
|
+
*
|
|
42
56
|
* Time Complexity: O(V * E²)
|
|
43
57
|
*/
|
|
44
|
-
export declare function edmondsKarp(graph: Map<string, Map<string, number>>, source: string, sink: string): MaxFlowResult;
|
|
45
|
-
/**
|
|
46
|
-
* Utility function to create a flow network for bipartite matching
|
|
47
|
-
*/
|
|
48
|
-
export declare function createBipartiteFlowNetwork(leftNodes: string[], rightNodes: string[], edges: [string, string][]): {
|
|
49
|
-
graph: Map<string, Map<string, number>>;
|
|
50
|
-
source: string;
|
|
51
|
-
sink: string;
|
|
52
|
-
};
|
|
58
|
+
export declare function edmondsKarp(graph: Graph | Map<string, Map<string, number>>, source: string, sink: string): MaxFlowResult;
|
|
53
59
|
//# sourceMappingURL=ford-fulkerson.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ford-fulkerson.d.ts","sourceRoot":"","sources":["../../../src/flow/ford-fulkerson.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ford-fulkerson.d.ts","sourceRoot":"","sources":["../../../src/flow/ford-fulkerson.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAG5C;;;;;GAKG;AAEH,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE;QAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAC,CAAC;CAChF;AA+QD;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAC1B;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CA2CzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CACzB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACb,aAAa,CAIf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACvB,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC/C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACb,aAAa,CAIf"}
|
|
@@ -1,186 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Finds the maximum flow from source to sink in a flow network
|
|
5
|
-
* using the method of augmenting paths.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Ford-Fulkerson algorithm using DFS for finding augmenting paths
|
|
9
|
-
*
|
|
10
|
-
* @param graph - Adjacency list representation with capacities
|
|
11
|
-
* @param source - Source node
|
|
12
|
-
* @param sink - Sink node
|
|
13
|
-
* @returns Maximum flow value and flow graph
|
|
14
|
-
*
|
|
15
|
-
* Time Complexity: O(E * f) where f is the maximum flow
|
|
16
|
-
* Space Complexity: O(V + E)
|
|
17
|
-
*/
|
|
18
|
-
export function fordFulkerson(graph, source, sink) {
|
|
19
|
-
if (!graph.has(source) || !graph.has(sink)) {
|
|
20
|
-
return { maxFlow: 0, flowGraph: new Map() };
|
|
21
|
-
}
|
|
22
|
-
// Create residual graph
|
|
23
|
-
const residualGraph = createResidualGraph(graph);
|
|
24
|
-
const flowGraph = new Map();
|
|
25
|
-
// Initialize flow graph
|
|
26
|
-
for (const [u, neighbors] of graph) {
|
|
27
|
-
flowGraph.set(u, new Map());
|
|
28
|
-
for (const v of neighbors.keys()) {
|
|
29
|
-
const uFlowNeighbors = flowGraph.get(u);
|
|
30
|
-
if (uFlowNeighbors) {
|
|
31
|
-
uFlowNeighbors.set(v, 0);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
let maxFlow = 0;
|
|
36
|
-
let path = findAugmentingPath(residualGraph, source, sink);
|
|
37
|
-
while (path !== null) {
|
|
38
|
-
// Find minimum capacity along the path
|
|
39
|
-
let pathFlow = Infinity;
|
|
40
|
-
for (let i = 0; i < path.length - 1; i++) {
|
|
41
|
-
const u = path[i];
|
|
42
|
-
const v = path[i + 1];
|
|
43
|
-
if (!u || !v) {
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
const uEdges = residualGraph.get(u);
|
|
47
|
-
if (!uEdges) {
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
const capacity = uEdges.get(v);
|
|
51
|
-
if (capacity !== undefined) {
|
|
52
|
-
pathFlow = Math.min(pathFlow, capacity);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
// Update residual capacities
|
|
56
|
-
for (let i = 0; i < path.length - 1; i++) {
|
|
57
|
-
const u = path[i];
|
|
58
|
-
const v = path[i + 1];
|
|
59
|
-
if (!u || !v) {
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
// Update residual graph
|
|
63
|
-
const uEdges = residualGraph.get(u);
|
|
64
|
-
if (uEdges) {
|
|
65
|
-
const currentCapacity = uEdges.get(v);
|
|
66
|
-
if (currentCapacity !== undefined) {
|
|
67
|
-
uEdges.set(v, currentCapacity - pathFlow);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// Add reverse edge
|
|
71
|
-
if (!residualGraph.has(v)) {
|
|
72
|
-
residualGraph.set(v, new Map());
|
|
73
|
-
}
|
|
74
|
-
const vEdges = residualGraph.get(v);
|
|
75
|
-
if (vEdges) {
|
|
76
|
-
vEdges.set(u, (vEdges.get(u) ?? 0) + pathFlow);
|
|
77
|
-
}
|
|
78
|
-
// Update flow graph
|
|
79
|
-
if (graph.get(u)?.has(v)) {
|
|
80
|
-
const uFlowEdges = flowGraph.get(u);
|
|
81
|
-
if (uFlowEdges) {
|
|
82
|
-
const currentFlow = uFlowEdges.get(v) ?? 0;
|
|
83
|
-
uFlowEdges.set(v, currentFlow + pathFlow);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
else if (graph.get(v)?.has(u)) {
|
|
87
|
-
// This is a reverse flow
|
|
88
|
-
const vFlowEdges = flowGraph.get(v);
|
|
89
|
-
if (vFlowEdges) {
|
|
90
|
-
const currentFlow = vFlowEdges.get(u) ?? 0;
|
|
91
|
-
vFlowEdges.set(u, currentFlow - pathFlow);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
maxFlow += pathFlow;
|
|
96
|
-
path = findAugmentingPath(residualGraph, source, sink);
|
|
97
|
-
}
|
|
98
|
-
// Find minimum cut
|
|
99
|
-
const minCut = findMinCut(residualGraph, source);
|
|
100
|
-
return { maxFlow, flowGraph, minCut };
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Edmonds-Karp algorithm (Ford-Fulkerson with BFS)
|
|
104
|
-
* More efficient implementation with better time complexity
|
|
105
|
-
*
|
|
106
|
-
* Time Complexity: O(V * E²)
|
|
107
|
-
*/
|
|
108
|
-
export function edmondsKarp(graph, source, sink) {
|
|
109
|
-
if (!graph.has(source) || !graph.has(sink)) {
|
|
110
|
-
return { maxFlow: 0, flowGraph: new Map() };
|
|
111
|
-
}
|
|
112
|
-
const residualGraph = createResidualGraph(graph);
|
|
113
|
-
const flowGraph = new Map();
|
|
114
|
-
// Initialize flow graph
|
|
115
|
-
for (const [u, neighbors] of graph) {
|
|
116
|
-
flowGraph.set(u, new Map());
|
|
117
|
-
for (const v of neighbors.keys()) {
|
|
118
|
-
const uFlowNeighbors = flowGraph.get(u);
|
|
119
|
-
if (uFlowNeighbors) {
|
|
120
|
-
uFlowNeighbors.set(v, 0);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
let maxFlow = 0;
|
|
125
|
-
let path = findAugmentingPathBFS(residualGraph, source, sink);
|
|
126
|
-
while (path !== null) {
|
|
127
|
-
let pathFlow = Infinity;
|
|
128
|
-
for (let i = 0; i < path.length - 1; i++) {
|
|
129
|
-
const u = path[i];
|
|
130
|
-
const v = path[i + 1];
|
|
131
|
-
if (!u || !v) {
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
const uEdges = residualGraph.get(u);
|
|
135
|
-
if (!uEdges) {
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
const capacity = uEdges.get(v);
|
|
139
|
-
if (capacity !== undefined) {
|
|
140
|
-
pathFlow = Math.min(pathFlow, capacity);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
for (let i = 0; i < path.length - 1; i++) {
|
|
144
|
-
const u = path[i];
|
|
145
|
-
const v = path[i + 1];
|
|
146
|
-
if (!u || !v) {
|
|
147
|
-
continue;
|
|
148
|
-
}
|
|
149
|
-
const uEdges = residualGraph.get(u);
|
|
150
|
-
if (uEdges) {
|
|
151
|
-
const currentCapacity = uEdges.get(v);
|
|
152
|
-
if (currentCapacity !== undefined) {
|
|
153
|
-
uEdges.set(v, currentCapacity - pathFlow);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (!residualGraph.has(v)) {
|
|
157
|
-
residualGraph.set(v, new Map());
|
|
158
|
-
}
|
|
159
|
-
const vEdges = residualGraph.get(v);
|
|
160
|
-
if (vEdges) {
|
|
161
|
-
vEdges.set(u, (vEdges.get(u) ?? 0) + pathFlow);
|
|
162
|
-
}
|
|
163
|
-
if (graph.get(u)?.has(v)) {
|
|
164
|
-
const uFlowEdges = flowGraph.get(u);
|
|
165
|
-
if (uFlowEdges) {
|
|
166
|
-
const currentFlow = uFlowEdges.get(v) ?? 0;
|
|
167
|
-
uFlowEdges.set(v, currentFlow + pathFlow);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
else if (graph.get(v)?.has(u)) {
|
|
171
|
-
const vFlowEdges = flowGraph.get(v);
|
|
172
|
-
if (vFlowEdges) {
|
|
173
|
-
const currentFlow = vFlowEdges.get(u) ?? 0;
|
|
174
|
-
vFlowEdges.set(u, currentFlow - pathFlow);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
maxFlow += pathFlow;
|
|
179
|
-
path = findAugmentingPathBFS(residualGraph, source, sink);
|
|
180
|
-
}
|
|
181
|
-
const minCut = findMinCut(residualGraph, source);
|
|
182
|
-
return { maxFlow, flowGraph, minCut };
|
|
183
|
-
}
|
|
1
|
+
import { bfsAugmentingPath } from "../algorithms/traversal/bfs-variants.js";
|
|
2
|
+
import { graphToMap } from "../utils/graph-converters.js";
|
|
184
3
|
/**
|
|
185
4
|
* Create residual graph from original graph
|
|
186
5
|
*/
|
|
@@ -200,7 +19,7 @@ function createResidualGraph(graph) {
|
|
|
200
19
|
/**
|
|
201
20
|
* Find augmenting path using DFS
|
|
202
21
|
*/
|
|
203
|
-
function
|
|
22
|
+
function findAugmentingPathDFS(residualGraph, source, sink) {
|
|
204
23
|
const visited = new Set();
|
|
205
24
|
const path = [];
|
|
206
25
|
function dfs(node) {
|
|
@@ -229,45 +48,48 @@ function findAugmentingPath(residualGraph, source, sink) {
|
|
|
229
48
|
return null;
|
|
230
49
|
}
|
|
231
50
|
/**
|
|
232
|
-
*
|
|
51
|
+
* Update flow along an augmenting path
|
|
233
52
|
*/
|
|
234
|
-
function
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
while (queue.length > 0) {
|
|
240
|
-
const current = queue.shift();
|
|
241
|
-
if (!current) {
|
|
53
|
+
function updateFlow(residualGraph, flowGraph, originalGraph, path, pathFlow) {
|
|
54
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
55
|
+
const u = path[i];
|
|
56
|
+
const v = path[i + 1];
|
|
57
|
+
if (!u || !v) {
|
|
242
58
|
continue;
|
|
243
59
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
60
|
+
// Update residual graph
|
|
61
|
+
const uEdges = residualGraph.get(u);
|
|
62
|
+
if (uEdges) {
|
|
63
|
+
const currentCapacity = uEdges.get(v);
|
|
64
|
+
if (currentCapacity !== undefined) {
|
|
65
|
+
uEdges.set(v, currentCapacity - pathFlow);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Add reverse edge
|
|
69
|
+
if (!residualGraph.has(v)) {
|
|
70
|
+
residualGraph.set(v, new Map());
|
|
71
|
+
}
|
|
72
|
+
const vEdges = residualGraph.get(v);
|
|
73
|
+
if (vEdges) {
|
|
74
|
+
vEdges.set(u, (vEdges.get(u) ?? 0) + pathFlow);
|
|
75
|
+
}
|
|
76
|
+
// Update flow graph
|
|
77
|
+
if (originalGraph.get(u)?.has(v)) {
|
|
78
|
+
const uFlowEdges = flowGraph.get(u);
|
|
79
|
+
if (uFlowEdges) {
|
|
80
|
+
const currentFlow = uFlowEdges.get(v) ?? 0;
|
|
81
|
+
uFlowEdges.set(v, currentFlow + pathFlow);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (originalGraph.get(v)?.has(u)) {
|
|
85
|
+
// This is a reverse flow
|
|
86
|
+
const vFlowEdges = flowGraph.get(v);
|
|
87
|
+
if (vFlowEdges) {
|
|
88
|
+
const currentFlow = vFlowEdges.get(u) ?? 0;
|
|
89
|
+
vFlowEdges.set(u, currentFlow - pathFlow);
|
|
267
90
|
}
|
|
268
91
|
}
|
|
269
92
|
}
|
|
270
|
-
return null;
|
|
271
93
|
}
|
|
272
94
|
/**
|
|
273
95
|
* Find minimum cut from source side
|
|
@@ -313,6 +135,76 @@ function findMinCut(residualGraph, source) {
|
|
|
313
135
|
}
|
|
314
136
|
return { source: sourceSet, sink: sinkSet, edges: cutEdges };
|
|
315
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Core max flow algorithm implementation
|
|
140
|
+
*/
|
|
141
|
+
function maxFlowCore(graph, source, sink, findPath) {
|
|
142
|
+
if (!graph.has(source) || !graph.has(sink)) {
|
|
143
|
+
return { maxFlow: 0, flowGraph: new Map() };
|
|
144
|
+
}
|
|
145
|
+
// Create residual graph
|
|
146
|
+
const residualGraph = createResidualGraph(graph);
|
|
147
|
+
const flowGraph = new Map();
|
|
148
|
+
// Initialize flow graph
|
|
149
|
+
for (const [u, neighbors] of graph) {
|
|
150
|
+
flowGraph.set(u, new Map());
|
|
151
|
+
for (const v of neighbors.keys()) {
|
|
152
|
+
const uFlowNeighbors = flowGraph.get(u);
|
|
153
|
+
if (uFlowNeighbors) {
|
|
154
|
+
uFlowNeighbors.set(v, 0);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
let maxFlow = 0;
|
|
159
|
+
let pathResult = findPath(residualGraph, source, sink);
|
|
160
|
+
while (pathResult !== null) {
|
|
161
|
+
const { path, pathCapacity } = pathResult;
|
|
162
|
+
// Update flow
|
|
163
|
+
updateFlow(residualGraph, flowGraph, graph, path, pathCapacity);
|
|
164
|
+
maxFlow += pathCapacity;
|
|
165
|
+
// Find next path
|
|
166
|
+
pathResult = findPath(residualGraph, source, sink);
|
|
167
|
+
}
|
|
168
|
+
// Find minimum cut
|
|
169
|
+
const minCut = findMinCut(residualGraph, source);
|
|
170
|
+
return { maxFlow, flowGraph, minCut };
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Internal implementation of Ford-Fulkerson algorithm using DFS
|
|
174
|
+
*/
|
|
175
|
+
function fordFulkersonImpl(graph, source, sink) {
|
|
176
|
+
// Adapter function for DFS path finding
|
|
177
|
+
const findPathDFS = (residual, src, snk) => {
|
|
178
|
+
const path = findAugmentingPathDFS(residual, src, snk);
|
|
179
|
+
if (!path) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
// Calculate path capacity
|
|
183
|
+
let pathCapacity = Infinity;
|
|
184
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
185
|
+
const u = path[i];
|
|
186
|
+
const v = path[i + 1];
|
|
187
|
+
if (u && v) {
|
|
188
|
+
const capacity = residual.get(u)?.get(v);
|
|
189
|
+
if (capacity !== undefined) {
|
|
190
|
+
pathCapacity = Math.min(pathCapacity, capacity);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { path, pathCapacity };
|
|
195
|
+
};
|
|
196
|
+
return maxFlowCore(graph, source, sink, findPathDFS);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Internal implementation of Edmonds-Karp algorithm
|
|
200
|
+
*/
|
|
201
|
+
function edmondsKarpImpl(graph, source, sink) {
|
|
202
|
+
// Use BFS variant for path finding
|
|
203
|
+
const findPathBFS = (residual, src, snk) => {
|
|
204
|
+
return bfsAugmentingPath(residual, src, snk);
|
|
205
|
+
};
|
|
206
|
+
return maxFlowCore(graph, source, sink, findPathBFS);
|
|
207
|
+
}
|
|
316
208
|
/**
|
|
317
209
|
* Utility function to create a flow network for bipartite matching
|
|
318
210
|
*/
|
|
@@ -352,4 +244,36 @@ export function createBipartiteFlowNetwork(leftNodes, rightNodes, edges) {
|
|
|
352
244
|
graph.set(sink, new Map());
|
|
353
245
|
return { graph, source, sink };
|
|
354
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Ford-Fulkerson algorithm using DFS for finding augmenting paths
|
|
249
|
+
*
|
|
250
|
+
* @param graph - Adjacency list representation with capacities - accepts Graph class or Map
|
|
251
|
+
* @param source - Source node
|
|
252
|
+
* @param sink - Sink node
|
|
253
|
+
* @returns Maximum flow value and flow graph
|
|
254
|
+
*
|
|
255
|
+
* Time Complexity: O(E * f) where f is the maximum flow
|
|
256
|
+
* Space Complexity: O(V + E)
|
|
257
|
+
*/
|
|
258
|
+
export function fordFulkerson(graph, source, sink) {
|
|
259
|
+
// Convert Graph to Map representation
|
|
260
|
+
const graphMap = graphToMap(graph);
|
|
261
|
+
return fordFulkersonImpl(graphMap, source, sink);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Edmonds-Karp algorithm (Ford-Fulkerson with BFS)
|
|
265
|
+
* More efficient implementation with better time complexity
|
|
266
|
+
*
|
|
267
|
+
* @param graph - Adjacency list representation with capacities - accepts Graph class or Map
|
|
268
|
+
* @param source - Source node
|
|
269
|
+
* @param sink - Sink node
|
|
270
|
+
* @returns Maximum flow value and flow graph
|
|
271
|
+
*
|
|
272
|
+
* Time Complexity: O(V * E²)
|
|
273
|
+
*/
|
|
274
|
+
export function edmondsKarp(graph, source, sink) {
|
|
275
|
+
// Convert Graph to Map representation if needed
|
|
276
|
+
const graphMap = graph instanceof Map ? graph : graphToMap(graph);
|
|
277
|
+
return edmondsKarpImpl(graphMap, source, sink);
|
|
278
|
+
}
|
|
355
279
|
//# sourceMappingURL=ford-fulkerson.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ford-fulkerson.js","sourceRoot":"","sources":["../../../src/flow/ford-fulkerson.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ford-fulkerson.js","sourceRoot":"","sources":["../../../src/flow/ford-fulkerson.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Various algorithms for finding minimum cuts in graphs
|
|
5
5
|
*/
|
|
6
|
+
import type { Graph } from "../core/graph.js";
|
|
6
7
|
export interface MinCutResult {
|
|
7
8
|
cutValue: number;
|
|
8
9
|
partition1: Set<string>;
|
|
@@ -24,26 +25,26 @@ export interface MinCutResult {
|
|
|
24
25
|
*
|
|
25
26
|
* Time Complexity: Same as max flow algorithm used
|
|
26
27
|
*/
|
|
27
|
-
export declare function minSTCut(graph:
|
|
28
|
+
export declare function minSTCut(graph: Graph, source: string, sink: string): MinCutResult;
|
|
28
29
|
/**
|
|
29
30
|
* Stoer-Wagner algorithm for finding global minimum cut
|
|
30
31
|
* Finds the minimum cut that separates the graph into two parts
|
|
31
32
|
*
|
|
32
|
-
* @param graph - Undirected weighted graph
|
|
33
|
+
* @param graph - Undirected weighted graph - accepts Graph class or Map representation
|
|
33
34
|
* @returns Global minimum cut
|
|
34
35
|
*
|
|
35
36
|
* Time Complexity: O(V³) or O(VE + V² log V) with heap
|
|
36
37
|
*/
|
|
37
|
-
export declare function stoerWagner(graph: Map<string, Map<string, number>>): MinCutResult;
|
|
38
|
+
export declare function stoerWagner(graph: Graph | Map<string, Map<string, number>>): MinCutResult;
|
|
38
39
|
/**
|
|
39
40
|
* Karger's randomized min-cut algorithm
|
|
40
41
|
* Probabilistic algorithm that finds min cut with high probability
|
|
41
42
|
*
|
|
42
|
-
* @param graph - Undirected graph
|
|
43
|
+
* @param graph - Undirected graph - accepts Graph class or Map representation
|
|
43
44
|
* @param iterations - Number of iterations (higher = better accuracy)
|
|
44
45
|
* @returns Minimum cut found
|
|
45
46
|
*
|
|
46
47
|
* Time Complexity: O(V² * iterations)
|
|
47
48
|
*/
|
|
48
|
-
export declare function kargerMinCut(graph: Map<string, Map<string, number>>, iterations?: number): MinCutResult;
|
|
49
|
+
export declare function kargerMinCut(graph: Graph | Map<string, Map<string, number>>, iterations?: number): MinCutResult;
|
|
49
50
|
//# sourceMappingURL=min-cut.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"min-cut.d.ts","sourceRoot":"","sources":["../../../src/flow/min-cut.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"min-cut.d.ts","sourceRoot":"","sources":["../../../src/flow/min-cut.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAI5C,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,QAAQ,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;CAC1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACpB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACb,YAAY,CA6Bd;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACvB,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAChD,YAAY,CAsFd;AA0JD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CACxB,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC/C,UAAU,SAAM,GACjB,YAAY,CAoCd"}
|
package/dist/src/flow/min-cut.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Various algorithms for finding minimum cuts in graphs
|
|
5
5
|
*/
|
|
6
|
+
import { graphToMap } from "../utils/graph-converters.js";
|
|
6
7
|
import { fordFulkerson } from "./ford-fulkerson.js";
|
|
7
8
|
/**
|
|
8
9
|
* Find minimum s-t cut using max flow
|
|
@@ -28,7 +29,8 @@ export function minSTCut(graph, source, sink) {
|
|
|
28
29
|
const cutEdges = [];
|
|
29
30
|
// Find actual cut edges and their weights
|
|
30
31
|
for (const [u, v] of flowResult.minCut.edges) {
|
|
31
|
-
const
|
|
32
|
+
const edge = graph.getEdge(u, v);
|
|
33
|
+
const weight = edge?.weight ?? 0;
|
|
32
34
|
if (weight > 0) {
|
|
33
35
|
cutEdges.push({ from: u, to: v, weight });
|
|
34
36
|
}
|
|
@@ -44,14 +46,18 @@ export function minSTCut(graph, source, sink) {
|
|
|
44
46
|
* Stoer-Wagner algorithm for finding global minimum cut
|
|
45
47
|
* Finds the minimum cut that separates the graph into two parts
|
|
46
48
|
*
|
|
47
|
-
* @param graph - Undirected weighted graph
|
|
49
|
+
* @param graph - Undirected weighted graph - accepts Graph class or Map representation
|
|
48
50
|
* @returns Global minimum cut
|
|
49
51
|
*
|
|
50
52
|
* Time Complexity: O(V³) or O(VE + V² log V) with heap
|
|
51
53
|
*/
|
|
52
54
|
export function stoerWagner(graph) {
|
|
55
|
+
// Convert Graph to Map representation if needed
|
|
56
|
+
const graphMap = graph instanceof Map ? graph : graphToMap(graph);
|
|
53
57
|
// Convert to undirected if necessary
|
|
54
|
-
const undirectedGraph = makeUndirected(
|
|
58
|
+
const undirectedGraph = makeUndirected(graphMap);
|
|
59
|
+
// Keep a copy for finding cut edges later
|
|
60
|
+
const originalGraph = makeUndirected(graphMap);
|
|
55
61
|
if (undirectedGraph.size < 2) {
|
|
56
62
|
return {
|
|
57
63
|
cutValue: 0,
|
|
@@ -62,6 +68,7 @@ export function stoerWagner(graph) {
|
|
|
62
68
|
}
|
|
63
69
|
// Initialize
|
|
64
70
|
const nodes = Array.from(undirectedGraph.keys());
|
|
71
|
+
const originalNodes = new Set(nodes); // Keep track of original nodes
|
|
65
72
|
let minCutValue = Infinity;
|
|
66
73
|
let bestPartition = new Set();
|
|
67
74
|
const contractionMap = new Map();
|
|
@@ -95,7 +102,7 @@ export function stoerWagner(graph) {
|
|
|
95
102
|
// Build result
|
|
96
103
|
const partition1 = bestPartition;
|
|
97
104
|
const partition2 = new Set();
|
|
98
|
-
for (const node of
|
|
105
|
+
for (const node of originalNodes) {
|
|
99
106
|
if (!partition1.has(node)) {
|
|
100
107
|
partition2.add(node);
|
|
101
108
|
}
|
|
@@ -103,7 +110,7 @@ export function stoerWagner(graph) {
|
|
|
103
110
|
// Find cut edges
|
|
104
111
|
const cutEdges = [];
|
|
105
112
|
for (const u of partition1) {
|
|
106
|
-
const neighbors =
|
|
113
|
+
const neighbors = originalGraph.get(u);
|
|
107
114
|
if (neighbors) {
|
|
108
115
|
for (const [v, weight] of neighbors) {
|
|
109
116
|
if (partition2.has(v)) {
|
|
@@ -241,18 +248,20 @@ function makeUndirected(graph) {
|
|
|
241
248
|
* Karger's randomized min-cut algorithm
|
|
242
249
|
* Probabilistic algorithm that finds min cut with high probability
|
|
243
250
|
*
|
|
244
|
-
* @param graph - Undirected graph
|
|
251
|
+
* @param graph - Undirected graph - accepts Graph class or Map representation
|
|
245
252
|
* @param iterations - Number of iterations (higher = better accuracy)
|
|
246
253
|
* @returns Minimum cut found
|
|
247
254
|
*
|
|
248
255
|
* Time Complexity: O(V² * iterations)
|
|
249
256
|
*/
|
|
250
257
|
export function kargerMinCut(graph, iterations = 100) {
|
|
258
|
+
// Convert Graph to Map representation if needed
|
|
259
|
+
const graphMap = graph instanceof Map ? graph : graphToMap(graph);
|
|
251
260
|
let minCutValue = Infinity;
|
|
252
261
|
let bestPartition1 = new Set();
|
|
253
262
|
let bestPartition2 = new Set();
|
|
254
263
|
for (let i = 0; i < iterations; i++) {
|
|
255
|
-
const result = kargerSingleRun(
|
|
264
|
+
const result = kargerSingleRun(graphMap);
|
|
256
265
|
if (result.cutValue < minCutValue) {
|
|
257
266
|
minCutValue = result.cutValue;
|
|
258
267
|
bestPartition1 = result.partition1;
|
|
@@ -262,7 +271,7 @@ export function kargerMinCut(graph, iterations = 100) {
|
|
|
262
271
|
// Find cut edges
|
|
263
272
|
const cutEdges = [];
|
|
264
273
|
for (const u of bestPartition1) {
|
|
265
|
-
const neighbors =
|
|
274
|
+
const neighbors = graphMap.get(u);
|
|
266
275
|
if (neighbors) {
|
|
267
276
|
for (const [v, weight] of neighbors) {
|
|
268
277
|
if (bestPartition2.has(v)) {
|