Cod sursa(job #2653291)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 27 septembrie 2020 16:36:15
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator rs Status done
Runda Arhiva educationala Marime 1.31 kb
use std::fs;
use std::fs::File;
use std::io::{BufRead, BufReader, BufWriter, Write, Read};
use std::cmp;
use std::i32::MAX;

const INF:i32 = MAX;

fn main() {
    let mut FIN = BufReader::new(File::open("royfloyd.in").unwrap());
    let mut FOUT = BufWriter::new(File::create("royfloyd.out").unwrap());

    let mut line = String::new();
    FIN.read_line(&mut line).unwrap();
    let siz: usize = line.trim().parse().unwrap();

    let mut dist: Vec<Vec<i32>> = vec![vec![0; siz]; siz];

    for i in 0..siz{
        line.clear();
        FIN.read_line(&mut line).unwrap();
        dist[i] = line.trim().split_whitespace().map(|x| x.parse().unwrap()).collect();
    }

    for i in 0..siz{
        for j in 0..siz{
            if dist[i][j] == 0 && i != j{
                dist[i][j] = INF;
            }
        }
    }

    for k in 0..siz{
        for i in 0..siz{
            for j in 0..siz{
                if i != k && j != k && i != j{
                    if ((dist[i][k] as i64) + (dist[k][j] as i64)) < (dist[i][j] as i64){
                        dist[i][j] = dist[i][k] + dist[k][j];
                    }
                }
            }
        }
    }

    for i in 0..siz{
        for j in 0..siz{
            FOUT.write(format!("{} ", dist[i][j]).as_bytes());
        }

        FOUT.write(format!("\n").as_bytes());
    }
}