competitive/graph/
graphvis.rs1use super::{BidirectionalSparseGraph, DirectedSparseGraph, UndirectedSparseGraph};
2use std::{fmt::Display, fmt::Write};
3
4impl DirectedSparseGraph {
5 pub fn to_graphvis<N, NA, E, EA>(&self, node_attr: N, edge_attr: E) -> String
6 where
7 N: Fn(usize) -> NA,
8 E: Fn(usize) -> EA,
9 NA: Display,
10 EA: Display,
11 {
12 let mut s = String::new();
13 s.push_str("digraph G {\n graph [ splines=false, layout=neato ];\n");
14 for u in self.vertices() {
15 writeln!(s, " {} [{}];", u, node_attr(u)).ok();
16 }
17 for u in self.vertices() {
18 for a in self.adjacencies(u) {
19 writeln!(s, " {} -> {} [{}];", u, a.to, edge_attr(a.id)).ok();
20 }
21 }
22 s.push('}');
23 s
24 }
25}
26
27impl UndirectedSparseGraph {
28 pub fn to_graphvis<N, NA, E, EA>(&self, node_attr: N, edge_attr: E) -> String
29 where
30 N: Fn(usize) -> NA,
31 E: Fn(usize) -> EA,
32 NA: Display,
33 EA: Display,
34 {
35 let mut s = String::new();
36 s.push_str("graph G {\n graph [ splines=false, layout=neato ];\n");
37 for u in self.vertices() {
38 writeln!(s, " {} [{}];", u, node_attr(u)).ok();
39 }
40 for (i, (u, v)) in self.edges.iter().cloned().enumerate() {
41 writeln!(s, " {} -- {} [{}];", u, v, edge_attr(i)).ok();
42 }
43 s.push('}');
44 s
45 }
46}
47
48impl BidirectionalSparseGraph {
49 pub fn to_graphvis<N, NA, E, EA>(&self, node_attr: N, edge_attr: E) -> String
50 where
51 N: Fn(usize) -> NA,
52 E: Fn(usize) -> EA,
53 NA: Display,
54 EA: Display,
55 {
56 let mut s = String::new();
57 s.push_str("digraph G {\n graph [ splines=false, layout=neato ];\n");
58 for u in self.vertices() {
59 writeln!(s, " {} [{}];", u, node_attr(u)).ok();
60 }
61 for u in self.vertices() {
62 for a in self.adjacencies(u) {
63 writeln!(s, " {} -> {} [{}];", u, a.to, edge_attr(a.id)).ok();
64 }
65 }
66 s.push('}');
67 s
68 }
69}