提出 #67977770


ソースコード 拡げる

#![allow(unused)]

fn main() {
    let inp = readv::<usize>();
    let (n, m) = (inp[0], inp[1]);

    let inf = 10i64.pow(18);
    let mut adj = vec![vec![inf; n + 1]; n + 1];
    for u in 0..=n {
        adj[u][u] = 0;
    }
    for _ in 0..m {
        let inp = readv::<i64>();
        let u = inp[0] as usize - 1;
        let v = inp[1] as usize - 1;
        let w = inp[2];
        adj[u][v] = adj[u][v].min(w);
        adj[v][u] = adj[v][u].min(w);
    }

    let inp = readv::<i64>();
    let (_, t) = (inp[0] as usize, inp[1]);
    let arr = readv::<usize>();
    for &x in &arr {
        adj[x - 1][n] = t; // x -> sky with t
        adj[n][x - 1] = 0; // sky -> x with 0
    }

    let mut dis = floyd_warshall(&adj, inf);
    let relax = |dis: &mut Vec<Vec<i64>>, x: usize, y: usize, w: i64| {
        for i in 0..=n {
            for j in 0..=n {
                if dis[i][x] != inf && dis[y][j] != inf {
                    dis[i][j] = dis[i][j].min(dis[i][x] + w + dis[y][j]);
                }
            }
        }
    };

    let q = read::<usize>();
    let mut ans = vec![];
    for _ in 0..q {
        let ask = readv::<i64>();
        if ask[0] == 1 {
            let x = ask[1] as usize - 1;
            let y = ask[2] as usize - 1;
            let w = ask[3];
            relax(&mut dis, x, y, w); // x -> y
            relax(&mut dis, y, x, w); // y -> x
        } else if ask[0] == 2 {
            let x = ask[1] as usize - 1;
            relax(&mut dis, x, n, t); // x -> sky
            relax(&mut dis, n, x, 0); // sky -> x
        } else {
            let mut val = 0;
            for u in 0..n {
                for v in 0..n {
                    if dis[u][v] != inf {
                        val += dis[u][v];
                    }
                }
            }
            ans.push(val);
        }
    }

    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 - Development
ユーザ amoshuangyc
言語 Rust (rustc 1.70.0)
得点 450
コード長 3254 Byte
結果 AC
実行時間 627 ms
メモリ 6076 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 450 / 450
結果
AC × 1
AC × 29
セット名 テストケース
Sample sample_01.txt
All hand.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, sample_01.txt
ケース名 結果 実行時間 メモリ
hand.txt AC 1 ms 1864 KiB
random_01.txt AC 485 ms 5928 KiB
random_02.txt AC 123 ms 2888 KiB
random_03.txt AC 473 ms 5956 KiB
random_04.txt AC 376 ms 5268 KiB
random_05.txt AC 479 ms 5988 KiB
random_06.txt AC 165 ms 3352 KiB
random_07.txt AC 556 ms 5904 KiB
random_08.txt AC 523 ms 5720 KiB
random_09.txt AC 565 ms 5868 KiB
random_10.txt AC 176 ms 3432 KiB
random_11.txt AC 619 ms 5844 KiB
random_12.txt AC 319 ms 4192 KiB
random_13.txt AC 605 ms 5860 KiB
random_14.txt AC 157 ms 3028 KiB
random_15.txt AC 613 ms 5924 KiB
random_16.txt AC 374 ms 4448 KiB
random_17.txt AC 623 ms 6076 KiB
random_18.txt AC 477 ms 4992 KiB
random_19.txt AC 627 ms 5844 KiB
random_20.txt AC 458 ms 4880 KiB
random_21.txt AC 111 ms 3700 KiB
random_22.txt AC 233 ms 3616 KiB
random_23.txt AC 333 ms 4020 KiB
random_24.txt AC 250 ms 3724 KiB
random_25.txt AC 435 ms 6076 KiB
random_26.txt AC 534 ms 5920 KiB
random_27.txt AC 567 ms 5888 KiB
sample_01.txt AC 1 ms 1928 KiB