From 32b72c10c88b71526837dd2f65f717337c2a768e Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 22 Oct 2022 18:46:55 +0200 Subject: [PATCH] Assign redirects a cost of 0 --- brood/src/commands/path.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/brood/src/commands/path.rs b/brood/src/commands/path.rs index 63352b2..2e2ca74 100644 --- a/brood/src/commands/path.rs +++ b/brood/src/commands/path.rs @@ -20,13 +20,15 @@ fn find_index_of_title(pages: &[Page], title: &str) -> u32 { struct DijkstraPageInfo { cost: u32, prev_page_idx: u32, + redirect: bool, } -impl Default for DijkstraPageInfo { - fn default() -> Self { +impl DijkstraPageInfo { + fn from_page_info(info: PageInfo) -> Self { Self { cost: u32::MAX, prev_page_idx: u32::MAX, + redirect: info.redirect, } } } @@ -39,7 +41,7 @@ impl DijkstraLinkInfo { const BASE_COST: u32 = 1000; fn from_link_info(info: LinkInfo) -> Self { - DijkstraLinkInfo { + Self { cost: Self::BASE_COST + info.start, } } @@ -81,7 +83,7 @@ fn dijkstra( ) -> Option> { println!("> Prepare state"); let mut data = data - .change_page_data(&|_| DijkstraPageInfo::default()) + .change_page_data(&DijkstraPageInfo::from_page_info) .change_link_data(&DijkstraLinkInfo::from_link_info); let mut queue = BinaryHeap::new(); data.page_mut(from_idx).data.cost = 0; @@ -94,16 +96,18 @@ fn dijkstra( break; } - if cost > data.page(page_idx).data.cost { + let page = data.page(page_idx); + if cost > page.data.cost { // This queue entry is outdated continue; } + let redirect = page.data.redirect; for link_idx in data.link_range(page_idx) { let link = data.link(link_idx); let next = Entry { - cost: cost + link.data.cost, + cost: cost + if redirect { 0 } else { link.data.cost }, page_idx: link.to, };