DynamicConnectivity

Struct DynamicConnectivity 

Source
pub struct DynamicConnectivity { /* private fields */ }
Expand description

Dynamic connectivity data structure with Euler Tour Tree backend

Maintains connected components of an undirected graph with support for edge insertions and deletions. Uses Euler Tour Trees for O(log n) operations with union-find fallback for robustness.

§Examples

let mut dc = DynamicConnectivity::new();
dc.add_vertex(0);
dc.add_vertex(1);
dc.add_vertex(2);

dc.insert_edge(0, 1);
assert!(dc.connected(0, 1));
assert!(!dc.connected(0, 2));

dc.insert_edge(1, 2);
assert!(dc.is_connected()); // All vertices connected

dc.delete_edge(1, 2);
assert!(!dc.connected(0, 2));

Implementations§

Source§

impl DynamicConnectivity

Source

pub fn new() -> Self

Creates a new empty dynamic connectivity structure

§Examples
let dc = DynamicConnectivity::new();
assert_eq!(dc.component_count(), 0);
Source

pub fn add_vertex(&mut self, v: VertexId)

Adds a vertex to the connectivity structure

If the vertex already exists, this is a no-op. Each new vertex starts in its own component.

§Arguments
  • v - The vertex ID to add
§Examples
let mut dc = DynamicConnectivity::new();
dc.add_vertex(0);
assert_eq!(dc.component_count(), 1);
Source

pub fn insert_edge(&mut self, u: VertexId, v: VertexId)

Inserts an edge between two vertices

Automatically adds vertices if they don’t exist. If vertices are already connected, updates internal state but doesn’t change connectivity.

§Arguments
  • u - First vertex
  • v - Second vertex
§Time Complexity

O(log n) via Euler Tour Tree link operation

§Examples
let mut dc = DynamicConnectivity::new();
dc.insert_edge(0, 1);
assert!(dc.connected(0, 1));
Source

pub fn delete_edge(&mut self, u: VertexId, v: VertexId)

Deletes an edge between two vertices

Triggers a full rebuild of the data structure from the remaining edges. The ETT is also rebuilt to maintain O(log n) queries.

§Arguments
  • u - First vertex
  • v - Second vertex
§Time Complexity

O(m·α(n)) where m is the number of edges (includes ETT rebuild)

§Examples
let mut dc = DynamicConnectivity::new();
dc.insert_edge(0, 1);
dc.delete_edge(0, 1);
assert!(!dc.connected(0, 1));
Source

pub fn is_connected(&self) -> bool

Checks if the entire graph is connected (single component)

§Returns

true if all vertices are in a single connected component, false otherwise

§Time Complexity

O(1)

§Examples
let mut dc = DynamicConnectivity::new();
dc.add_vertex(0);
dc.add_vertex(1);
assert!(!dc.is_connected());

dc.insert_edge(0, 1);
assert!(dc.is_connected());
Source

pub fn connected(&mut self, u: VertexId, v: VertexId) -> bool

Checks if two vertices are in the same connected component

§Arguments
  • u - First vertex
  • v - Second vertex
§Returns

true if vertices are connected, false otherwise. Returns false if either vertex doesn’t exist.

§Time Complexity

O(α(n)) amortized via union-find with path compression

§Examples
let mut dc = DynamicConnectivity::new();
dc.insert_edge(0, 1);
dc.insert_edge(1, 2);
assert!(dc.connected(0, 2));
Source

pub fn connected_fast(&self, u: VertexId, v: VertexId) -> Option<bool>

Fast connectivity check using Euler Tour Tree (O(log n))

Returns None if ETT is out of sync and result is unreliable. Use connected() for the reliable version.

Source

pub fn component_count(&self) -> usize

Returns the number of connected components

§Returns

The current number of connected components

Source

pub fn vertex_count(&self) -> usize

Returns the number of vertices

§Returns

The current number of vertices

Trait Implementations§

Source§

impl Clone for DynamicConnectivity

Source§

fn clone(&self) -> DynamicConnectivity

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DynamicConnectivity

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for DynamicConnectivity

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V