competitive/graph/
edge_list.rs1use super::{IterScan, MarkedIterScan};
2use std::{marker::PhantomData, ops::Range, slice::Iter};
3
4#[derive(Clone, Debug)]
5pub struct EdgeListGraph {
7 vsize: usize,
8 edges: Vec<(usize, usize)>,
9}
10impl EdgeListGraph {
11 pub fn new(vsize: usize) -> Self {
13 Self {
14 vsize,
15 edges: Vec::new(),
16 }
17 }
18 pub fn vertices_size(&self) -> usize {
20 self.vsize
21 }
22 pub fn edges_size(&self) -> usize {
24 self.edges.len()
25 }
26 pub fn vertices(&self) -> Range<usize> {
28 0..self.vertices_size()
29 }
30 pub fn edges(&self) -> Iter<'_, (usize, usize)> {
31 self.edges.iter()
32 }
33 pub fn from_edges(vsize: usize, edges: Vec<(usize, usize)>) -> Self {
35 Self { vsize, edges }
36 }
37}
38impl std::ops::Index<usize> for EdgeListGraph {
39 type Output = (usize, usize);
40 fn index(&self, index: usize) -> &Self::Output {
41 &self.edges[index]
42 }
43}
44
45pub struct EdgeListGraphScanner<U: IterScan<Output = usize>, T: IterScan> {
46 vsize: usize,
47 esize: usize,
48 _marker: PhantomData<fn() -> (U, T)>,
49}
50
51impl<U: IterScan<Output = usize>, T: IterScan> EdgeListGraphScanner<U, T> {
52 pub fn new(vsize: usize, esize: usize) -> Self {
53 Self {
54 vsize,
55 esize,
56 _marker: PhantomData,
57 }
58 }
59}
60
61impl<U: IterScan<Output = usize>, T: IterScan> MarkedIterScan for EdgeListGraphScanner<U, T> {
62 type Output = (EdgeListGraph, Vec<<T as IterScan>::Output>);
63 fn mscan<'a, I: Iterator<Item = &'a str>>(self, iter: &mut I) -> Option<Self::Output> {
64 let mut edges = Vec::with_capacity(self.esize);
65 let mut rest = Vec::with_capacity(self.esize);
66 for _ in 0..self.esize {
67 edges.push((U::scan(iter)?, U::scan(iter)?));
68 rest.push(T::scan(iter)?);
69 }
70 let graph = EdgeListGraph::from_edges(self.vsize, edges);
71 Some((graph, rest))
72 }
73}