Advertisement
Guest User

Floyd-Warshall test

a guest
Nov 20th, 2021
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.99 KB | None | 0 0
  1. use std::cmp::min;
  2.  
  3. use rand::{thread_rng, Rng};
  4. use std::time::Instant;
  5.  
  6. /*
  7.   [dist] should contain [n] vectors each of length [n]
  8.  
  9.   dist[i][j] = initial distance between [i] and [j]
  10.  
  11.   After function returns, dist[i][j] contains shortest
  12.   distance between [i] and [j], which could visit other
  13.   vertices
  14. */
  15. fn floyd_warshall_slow(dist: &mut [Vec<i32>]) {
  16.     let n = dist.len();
  17.     for i in 0..n {
  18.         for j in 0..n {
  19.             for k in 0..n {
  20.                 dist[j][k] = min(dist[j][k], dist[j][i] + dist[i][k]);
  21.             }
  22.         }
  23.     }
  24. }
  25.  
  26. fn floyd_warshall_unsafe(dist: &mut [Vec<i32>]) {
  27.     let n = dist.len();
  28.     for i in 0..n {
  29.         for j in 0..n {
  30.             for k in 0..n {
  31.                 unsafe {
  32.                     *dist[j].get_unchecked_mut(k) = min(
  33.                         *dist[j].get_unchecked(k),
  34.                         dist[j].get_unchecked(i) + dist[i].get_unchecked(k),
  35.                     )
  36.                 }
  37.             }
  38.         }
  39.     }
  40. }
  41.  
  42. // Returns hash of final dists
  43. fn test_one_algorithm(
  44.     mut init_dists: Vec<Vec<i32>>,
  45.     algo: fn(&mut [Vec<i32>]) -> (),
  46.     name: &str,
  47. ) -> i32 {
  48.     let start = Instant::now();
  49.     algo(&mut init_dists);
  50.     let elapsed = start.elapsed().as_millis();
  51.     println!("Algo {} finished in {}ms", name, elapsed);
  52.     let mut hash_sum = 0;
  53.     for row in init_dists.iter() {
  54.         for val in row.iter() {
  55.             hash_sum ^= *val;
  56.         }
  57.     }
  58.     hash_sum
  59. }
  60.  
  61. pub fn main() {
  62.     let n = 750;
  63.     let mut d = vec![vec![0; n]; n];
  64.     let mut rng = thread_rng();
  65.  
  66.     for _ in 1.. {
  67.         for x in 0..n {
  68.             for y in 0..n {
  69.                 d[x][y] = rng.gen_range(0..1_000_000);
  70.             }
  71.             d[x][x] = 0;
  72.         }
  73.         let hash_unsafe = test_one_algorithm(d.clone(), floyd_warshall_unsafe, "unsafe");
  74.         let hash_slow = test_one_algorithm(d.clone(), floyd_warshall_slow, "slow");
  75.         assert_eq!(hash_slow, hash_unsafe);
  76.     }
  77. }
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement