結果

問題 No.2387 Yokan Factory
ユーザー 👑 MizarMizar
提出日時 2023-07-01 17:13:30
言語 Rust
(1.77.0)
結果
AC  
実行時間 190 ms / 5,000 ms
コード長 2,245 bytes
コンパイル時間 1,297 ms
コンパイル使用メモリ 151,784 KB
実行使用メモリ 8,576 KB
最終ジャッジ日時 2023-09-22 11:27:07
合計ジャッジ時間 4,314 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,376 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 1 ms
4,380 KB
testcase_03 AC 1 ms
4,380 KB
testcase_04 AC 1 ms
4,376 KB
testcase_05 AC 1 ms
4,380 KB
testcase_06 AC 1 ms
4,380 KB
testcase_07 AC 1 ms
4,376 KB
testcase_08 AC 1 ms
4,380 KB
testcase_09 AC 1 ms
4,376 KB
testcase_10 AC 1 ms
4,380 KB
testcase_11 AC 1 ms
4,376 KB
testcase_12 AC 1 ms
4,380 KB
testcase_13 AC 1 ms
4,376 KB
testcase_14 AC 1 ms
4,380 KB
testcase_15 AC 117 ms
7,384 KB
testcase_16 AC 43 ms
8,488 KB
testcase_17 AC 190 ms
8,548 KB
testcase_18 AC 164 ms
8,576 KB
testcase_19 AC 103 ms
5,608 KB
testcase_20 AC 39 ms
5,480 KB
testcase_21 AC 145 ms
7,904 KB
testcase_22 AC 39 ms
5,152 KB
testcase_23 AC 180 ms
5,788 KB
testcase_24 AC 45 ms
5,212 KB
testcase_25 AC 64 ms
4,472 KB
testcase_26 AC 90 ms
6,284 KB
testcase_27 AC 53 ms
7,416 KB
testcase_28 AC 1 ms
4,380 KB
testcase_29 AC 1 ms
4,380 KB
testcase_30 AC 2 ms
4,376 KB
testcase_31 AC 2 ms
4,380 KB
testcase_32 AC 1 ms
4,376 KB
testcase_33 AC 1 ms
4,384 KB
testcase_34 AC 2 ms
4,380 KB
testcase_35 AC 1 ms
4,380 KB
testcase_36 AC 1 ms
4,380 KB
testcase_37 AC 1 ms
4,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