提出 #65400848


ソースコード 拡げる

#![allow(unused)]

fn main() {
    let inp = readv::<usize>();
    let (n, m, l) = (inp[0], inp[1], inp[2] as i64);
    let inf = 10i64.pow(18);

    let mut adj = vec![vec![inf; n]; n];
    for u in 0..n {
        adj[u][u] = 0;
    }
    for _ in 0..m {
        let edge = readv::<usize>();
        let (u, v, w) = (edge[0] - 1, edge[1] - 1, edge[2] as i64);
        adj[u][v] = w;
        adj[v][u] = w;
    }
    let dis = floyd_warshall(&adj, inf);

    let mut shortcuts = vec![vec![inf; n]; n];
    for u in 0..n {
        shortcuts[u][u] = 0;
        for v in 0..n {
            if dis[u][v] <= l {
                shortcuts[u][v] = 1;
                shortcuts[v][u] = 1;
            }
        }
    }
    let jumps = floyd_warshall(&shortcuts, inf);

    let q = read::<usize>();
    let mut ans = vec![];
    for _ in 0..q {
        let ask = readv::<usize>();
        let (u, v) = (ask[0] - 1, ask[1] - 1);
        if jumps[u][v] == inf {
            ans.push(-1);
        } else {
            ans.push(jumps[u][v] - 1);
        }
    }

    println!("{}", join(&ans, "\n"));
}

fn floyd_warshall(adj: &Vec<Vec<i64>>, inf: i64) -> Vec<Vec<i64>> {
    // dp[k][u][v] = minimum distance from u to v using vertices 0..=k as intermediate
    // dp[-1][u][v] = adj[u][v]
    // dp[k][u][v] = min(dp[k - 1][u][v], dp[k - 1][u][k] + dp[k - 1][k][v]);
    // adj[u][u] is usally 0. Remember to check it.
    let n = adj.len();
    let mut dp = adj.clone();
    for k in 0..n {
        for u in 0..n {
            for v in 0..n {
                if dp[u][k] != inf && dp[k][v] != inf {
                    dp[u][v] = dp[u][v].min(dp[u][k] + dp[k][v]);
                }
            }
        }
    }
    dp
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s);
    s.trim().parse().ok().unwrap()
}

fn readv<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_ascii_whitespace()
        .map(|t| t.parse().ok().unwrap())
        .collect()
}

fn reads() -> Vec<char> {
    read::<String>().chars().collect()
}

fn mapv<T, S, F: Fn(&T) -> S>(arr: &Vec<T>, f: F) -> Vec<S> {
    arr.iter().map(f).collect()
}

fn join<T: ToString>(arr: &[T], sep: &str) -> String {
    arr.iter()
        .map(|x| x.to_string())
        .collect::<Vec<String>>()
        .join(sep)
}

提出情報

提出日時
問題 E - Travel by Car
ユーザ amoshuangyc
言語 Rust (rustc 1.70.0)
得点 500
コード長 2439 Byte
結果 AC
実行時間 105 ms
メモリ 10512 KiB

ジャッジ結果

セット名 Sample All after_contest (0)
得点 / 配点 0 / 0 500 / 500 0 / 0
結果
AC × 3
AC × 50
AC × 1
セット名 テストケース
Sample 00-sample-00, 00-sample-01, 00-sample-02
All 00-sample-00, 00-sample-01, 00-sample-02, 01-handmade-03, 01-handmade-04, 01-handmade-05, 01-handmade-06, 01-handmade-07, 02-random-08, 02-random-09, 02-random-10, 02-random-11, 02-random-12, 02-random-13, 02-random-14, 02-random-15, 02-random-16, 02-random-17, 02-random-18, 02-random-19, 02-random-20, 02-random-21, 02-random-22, 02-random-23, 02-random-24, 02-random-25, 02-random-26, 02-random-27, 02-random-28, 02-random-29, 02-random-30, 02-random-31, 02-random-32, 02-random-33, 02-random-34, 02-random-35, 02-random-36, 02-random-37, 02-random-38, 02-random-39, 02-random-40, 02-random-41, 02-random-42, 02-random-43, 02-random-44, 02-random-45, 02-random-46, 02-random-47, 02-random-48, 02-random-49
after_contest (0) after_contest_00
ケース名 結果 実行時間 メモリ
00-sample-00 AC 1 ms 1892 KiB
00-sample-01 AC 1 ms 1928 KiB
00-sample-02 AC 1 ms 1928 KiB
01-handmade-03 AC 57 ms 10428 KiB
01-handmade-04 AC 104 ms 10348 KiB
01-handmade-05 AC 105 ms 10424 KiB
01-handmade-06 AC 79 ms 10464 KiB
01-handmade-07 AC 77 ms 10376 KiB
02-random-08 AC 1 ms 1992 KiB
02-random-09 AC 3 ms 2288 KiB
02-random-10 AC 64 ms 10440 KiB
02-random-11 AC 2 ms 2348 KiB
02-random-12 AC 6 ms 2912 KiB
02-random-13 AC 8 ms 3144 KiB
02-random-14 AC 67 ms 8136 KiB
02-random-15 AC 59 ms 10484 KiB
02-random-16 AC 25 ms 5248 KiB
02-random-17 AC 39 ms 7312 KiB
02-random-18 AC 2 ms 2356 KiB
02-random-19 AC 1 ms 1944 KiB
02-random-20 AC 59 ms 10400 KiB
02-random-21 AC 12 ms 3836 KiB
02-random-22 AC 1 ms 1924 KiB
02-random-23 AC 22 ms 4488 KiB
02-random-24 AC 80 ms 8836 KiB
02-random-25 AC 63 ms 10376 KiB
02-random-26 AC 1 ms 1940 KiB
02-random-27 AC 25 ms 6000 KiB
02-random-28 AC 38 ms 5948 KiB
02-random-29 AC 30 ms 5244 KiB
02-random-30 AC 60 ms 10364 KiB
02-random-31 AC 2 ms 2388 KiB
02-random-32 AC 19 ms 4856 KiB
02-random-33 AC 29 ms 5292 KiB
02-random-34 AC 21 ms 4448 KiB
02-random-35 AC 61 ms 10512 KiB
02-random-36 AC 16 ms 4356 KiB
02-random-37 AC 27 ms 5300 KiB
02-random-38 AC 0 ms 2096 KiB
02-random-39 AC 1 ms 2044 KiB
02-random-40 AC 63 ms 10200 KiB
02-random-41 AC 75 ms 10316 KiB
02-random-42 AC 7 ms 3532 KiB
02-random-43 AC 76 ms 8800 KiB
02-random-44 AC 1 ms 1960 KiB
02-random-45 AC 60 ms 10428 KiB
02-random-46 AC 3 ms 2520 KiB
02-random-47 AC 47 ms 8428 KiB
02-random-48 AC 1 ms 1920 KiB
02-random-49 AC 5 ms 2616 KiB
after_contest_00 AC 104 ms 10392 KiB