summaryrefslogtreecommitdiffstats
path: root/day7/src/topo_order.rs
diff options
context:
space:
mode:
Diffstat (limited to 'day7/src/topo_order.rs')
-rw-r--r--day7/src/topo_order.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/day7/src/topo_order.rs b/day7/src/topo_order.rs
new file mode 100644
index 0000000..abb0738
--- /dev/null
+++ b/day7/src/topo_order.rs
@@ -0,0 +1,54 @@
+use std::collections::HashSet;
+use {Vertex, Edge};
+
+pub fn find(V: &HashSet<Vertex>, E: &HashSet<Edge>, V_sources: &HashSet<Vertex>) -> String {
+ let mut sources_vec: Vec<Vertex> = V_sources.iter().map(|&v| v).collect();
+ sources_vec.sort();
+
+ let sources_repr: String = sources_vec.iter().collect();
+ println!("sources_repr: {}", sources_repr);
+
+ let mut result: Vec<char> = Vec::new();
+ let mut ready: Vec<Vertex> = sources_vec;
+ loop {
+ if ready.len() == 0 {
+ break;
+ }
+
+ let v: Vertex = ready[0];
+ ready.remove(0);
+
+ if !result.contains(&v) {
+ result.push(v);
+ }
+
+ let destinations: Vec<Vertex> = E.iter()
+ .filter(|&(v1, _v2)| *v1 == v)
+ .map(|&(_v1, v2)| v2)
+ .collect();
+
+ for dest_v in &destinations {
+ let sources: Vec<Vertex> = E.iter()
+ .filter(|&(_v1, v2)| *v2 == *dest_v)
+ .map(|&(v1, _v2)| v1)
+ .collect();
+
+ let mut ok = true;
+ for s in &sources {
+ if !result.contains(&s) {
+ ok = false;
+ break;
+ }
+ }
+
+ if ok {
+ ready.push(*dest_v);
+ }
+ }
+
+ ready.sort();
+ }
+
+ let result_repr: String = result.into_iter().collect();
+ result_repr
+}