Cod sursa(job #3313198)

Utilizator game_difficultyCalin Crangus game_difficulty Data 2 octombrie 2025 20:17:44
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator rs Status done
Runda Arhiva educationala Marime 1.37 kb
use std::fs::File;
#[allow(unused_imports)]
use std::io::{BufRead, BufReader, Read, Write};
use std::{cmp::min, error::Error};

const FILE: &'static str = "royfloyd";

fn main() -> Result<(), Box<dyn Error>> {
    let mut fin = BufReader::new(File::open(format!("{}.in", FILE)).unwrap());
    let mut fout = File::create(format!("{}.out", FILE)).unwrap();

    let mut buf = String::new();

    fin.read_line(&mut buf)?;
    let n = buf.trim().parse::<usize>()?;

    buf.clear();
    fin.read_to_string(&mut buf)?;
    let mut iterator = buf.trim().split_whitespace();

    let mut graf = vec![vec![0; n]; n];

    for i in 0..n {
        for j in 0..n {
            graf[i][j] = iterator.next().unwrap().parse::<usize>()?;
        }
    }

    for k in 0..n {
        for i in 0..n {
            if graf[i][k] == 0 {
                continue;
            }
            for j in 0..n {
                if graf[k][j] == 0 {
                    continue;
                }
                if graf[i][j] != 0 {
                    graf[i][j] = min(graf[i][j], graf[i][k] + graf[k][j]);
                } else {
                    graf[i][j] = graf[i][k] + graf[k][j];
                }
            }
        }
    }

    for i in 0..n {
        for j in 0..n {
            write!(&mut fout, "{} ", if i != j { graf[i][j] } else { 0 })?;
        }
        write!(&mut fout, "\n")?;
    }

    Ok(())
}