結果

問題 No.2387 Yokan Factory
ユーザー 👑 MizarMizar
提出日時 2023-07-01 17:13:30
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 249 ms / 5,000 ms
コード長 2,245 bytes
コンパイル時間 15,488 ms
コンパイル使用メモリ 379,340 KB
実行使用メモリ 8,680 KB
最終ジャッジ日時 2024-07-08 03:17:09
合計ジャッジ時間 18,202 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 AC 1 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 AC 1 ms
5,376 KB
testcase_06 AC 1 ms
5,376 KB
testcase_07 AC 1 ms
5,376 KB
testcase_08 AC 1 ms
5,376 KB
testcase_09 AC 1 ms
5,376 KB
testcase_10 AC 1 ms
5,376 KB
testcase_11 AC 1 ms
5,376 KB
testcase_12 AC 1 ms
5,376 KB
testcase_13 AC 1 ms
5,376 KB
testcase_14 AC 1 ms
5,376 KB
testcase_15 AC 117 ms
7,448 KB
testcase_16 AC 44 ms
8,428 KB
testcase_17 AC 186 ms
8,680 KB
testcase_18 AC 249 ms
8,592 KB
testcase_19 AC 77 ms
5,676 KB
testcase_20 AC 42 ms
5,500 KB
testcase_21 AC 187 ms
7,824 KB
testcase_22 AC 39 ms
5,376 KB
testcase_23 AC 203 ms
5,800 KB
testcase_24 AC 48 ms
5,376 KB
testcase_25 AC 66 ms
5,376 KB
testcase_26 AC 98 ms
6,400 KB
testcase_27 AC 61 ms
7,296 KB
testcase_28 AC 1 ms
5,376 KB
testcase_29 AC 1 ms
5,376 KB
testcase_30 AC 1 ms
5,376 KB
testcase_31 AC 1 ms
5,376 KB
testcase_32 AC 1 ms
5,376 KB
testcase_33 AC 1 ms
5,376 KB
testcase_34 AC 2 ms
5,376 KB
testcase_35 AC 2 ms
5,376 KB
testcase_36 AC 1 ms
5,376 KB
testcase_37 AC 1 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// -*- coding:utf-8-unix -*-
use std::{cmp::Reverse, collections::BinaryHeap, io::prelude::*};

fn main() {
    let stdin = std::io::stdin();
    let mut lines = stdin.lock().lines();

    let (n, m, x) = {
        let l = lines.next().unwrap().unwrap();
        let mut t = l.split_ascii_whitespace();
        let n = t.next().unwrap().parse::<usize>().unwrap();
        let m = t.next().unwrap().parse::<usize>().unwrap();
        let x = t.next().unwrap().parse::<u64>().unwrap();
        (n, m, x)
    };
    let n1 = n - 1;
    let mut g = (0..n)
        .map(|_| Vec::<(u32, u32, u32)>::new())
        .collect::<Vec<_>>();
    let mut yokan = (0u32, 1000000000u32);
    let mut queue = BinaryHeap::with_capacity(n + m);

    for _ in 0..m {
        let l = lines.next().unwrap().unwrap();
        let mut t = l.split_ascii_whitespace();
        let u = t.next().unwrap().parse::<u32>().unwrap() - 1;
        let v = t.next().unwrap().parse::<u32>().unwrap() - 1;
        let a = t.next().unwrap().parse::<u32>().unwrap();
        let b = t.next().unwrap().parse::<u32>().unwrap();

        g[u as usize].push((v, a, b));
        g[v as usize].push((u, a, b));
    }

    while yokan.0 < yokan.1 {
        let pivot = (yokan.1 - yokan.0 + 1) / 2 + yokan.0;
        let mut dists = vec![1u64 << 60; n];
        dists[0] = 0;
        queue.clear();
        queue.push(Reverse((0u64, 0usize)));
        while let Some(Reverse((pd, i))) = queue.pop() {
            if dists[i] < pd {
                continue;
            }
            for &(j, a, b) in g[i].iter() {
                let ju = j as usize;
                let nd = pd + (a as u64);
                if b < pivot || nd > x || dists[ju] <= nd {
                    continue;
                }
                dists[ju] = nd;
                if ju == n1 {
                    queue.clear();
                    break;
                }
                queue.push(Reverse((nd, ju)));
            }
        }
        if dists[n1] <= x {
            yokan.0 = pivot;
        } else {
            yokan.1 = pivot - 1;
        }
    }

    println!(
        "{}",
        if yokan.0 == 0 {
            "-1".to_string()
        } else {
            yokan.0.to_string()
        }
    );
}
0