pub fn maximum_matching<G>(graph: G) -> Matching<G>where
    G: Visitable + NodeIndexable + IntoNodeIdentifiers + IntoEdges,
Expand description

[Generic] Compute the maximum matching using Gabow’s algorithm.

The input graph is treated as if undirected. The algorithm runs in O(|V|³). An algorithm with a better time complexity might be used in the future.

Panics if g.node_bound() is std::usize::MAX.

Examples

use petgraph::prelude::*;
use petgraph::algo::maximum_matching;

// The example graph:
//
//    +-- b ---- d ---- f
//   /    |      |
//  a     |      |
//   \    |      |
//    +-- c ---- e
//
// Maximum matching: { (a, b), (c, e), (d, f) }

let mut graph: UnGraph<(), ()> = UnGraph::new_undirected();
let a = graph.add_node(());
let b = graph.add_node(());
let c = graph.add_node(());
let d = graph.add_node(());
let e = graph.add_node(());
let f = graph.add_node(());
graph.extend_with_edges(&[(a, b), (a, c), (b, c), (b, d), (c, e), (d, e), (d, f)]);

let matching = maximum_matching(&graph);
assert!(matching.contains_edge(a, b));
assert!(matching.contains_edge(c, e));
assert_eq!(matching.mate(d), Some(f));
assert_eq!(matching.mate(f), Some(d));