rust_igraph/algorithms/properties/
satisfies_dirac.rs1use crate::core::{Graph, IgraphResult};
11
12pub fn satisfies_dirac(graph: &Graph) -> IgraphResult<bool> {
44 if graph.is_directed() {
45 return Ok(false);
46 }
47
48 let n = graph.vcount();
49 if n < 3 {
50 return Ok(false);
51 }
52
53 let threshold = (n as usize).div_ceil(2);
54
55 for v in 0..n {
56 let deg = graph.degree(v)?;
57 if deg < threshold {
58 return Ok(false);
59 }
60 }
61
62 Ok(true)
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn empty_graph() {
71 let g = Graph::with_vertices(0);
72 assert!(!satisfies_dirac(&g).unwrap());
73 }
74
75 #[test]
76 fn single_vertex() {
77 let g = Graph::with_vertices(1);
78 assert!(!satisfies_dirac(&g).unwrap());
79 }
80
81 #[test]
82 fn two_vertices() {
83 let mut g = Graph::with_vertices(2);
84 g.add_edge(0, 1).unwrap();
85 assert!(!satisfies_dirac(&g).unwrap());
86 }
87
88 #[test]
89 fn triangle() {
90 let mut g = Graph::with_vertices(3);
92 g.add_edge(0, 1).unwrap();
93 g.add_edge(1, 2).unwrap();
94 g.add_edge(2, 0).unwrap();
95 assert!(satisfies_dirac(&g).unwrap());
96 }
97
98 #[test]
99 fn complete_k4() {
100 let mut g = Graph::with_vertices(4);
102 for i in 0..4u32 {
103 for j in (i + 1)..4 {
104 g.add_edge(i, j).unwrap();
105 }
106 }
107 assert!(satisfies_dirac(&g).unwrap());
108 }
109
110 #[test]
111 fn complete_k5() {
112 let mut g = Graph::with_vertices(5);
113 for i in 0..5u32 {
114 for j in (i + 1)..5 {
115 g.add_edge(i, j).unwrap();
116 }
117 }
118 assert!(satisfies_dirac(&g).unwrap());
119 }
120
121 #[test]
122 fn c4() {
123 let mut g = Graph::with_vertices(4);
125 g.add_edge(0, 1).unwrap();
126 g.add_edge(1, 2).unwrap();
127 g.add_edge(2, 3).unwrap();
128 g.add_edge(3, 0).unwrap();
129 assert!(satisfies_dirac(&g).unwrap());
130 }
131
132 #[test]
133 fn c5_fails() {
134 let mut g = Graph::with_vertices(5);
144 g.add_edge(0, 1).unwrap();
145 g.add_edge(1, 2).unwrap();
146 g.add_edge(2, 3).unwrap();
147 g.add_edge(3, 4).unwrap();
148 g.add_edge(4, 0).unwrap();
149 assert!(!satisfies_dirac(&g).unwrap());
150 }
151
152 #[test]
153 fn path_p4_fails() {
154 let mut g = Graph::with_vertices(4);
156 g.add_edge(0, 1).unwrap();
157 g.add_edge(1, 2).unwrap();
158 g.add_edge(2, 3).unwrap();
159 assert!(!satisfies_dirac(&g).unwrap());
160 }
161
162 #[test]
163 fn star_fails() {
164 let mut g = Graph::with_vertices(5);
166 g.add_edge(0, 1).unwrap();
167 g.add_edge(0, 2).unwrap();
168 g.add_edge(0, 3).unwrap();
169 g.add_edge(0, 4).unwrap();
170 assert!(!satisfies_dirac(&g).unwrap());
171 }
172
173 #[test]
174 fn directed_returns_false() {
175 let mut g = Graph::new(3, true).unwrap();
176 g.add_edge(0, 1).unwrap();
177 g.add_edge(1, 2).unwrap();
178 g.add_edge(2, 0).unwrap();
179 assert!(!satisfies_dirac(&g).unwrap());
180 }
181
182 #[test]
183 fn complete_bipartite_k33() {
184 let mut g = Graph::with_vertices(6);
186 for i in 0..3u32 {
187 for j in 3..6u32 {
188 g.add_edge(i, j).unwrap();
189 }
190 }
191 assert!(satisfies_dirac(&g).unwrap());
192 }
193
194 #[test]
195 fn k22_satisfies() {
196 let mut g = Graph::with_vertices(4);
198 g.add_edge(0, 2).unwrap();
199 g.add_edge(0, 3).unwrap();
200 g.add_edge(1, 2).unwrap();
201 g.add_edge(1, 3).unwrap();
202 assert!(satisfies_dirac(&g).unwrap());
203 }
204}