結果

問題 No.2387 Yokan Factory
ユーザー 👑 MizarMizar
提出日時 2023-07-01 17:31:47
言語 Rust
(1.77.0)
結果
AC  
実行時間 189 ms / 5,000 ms
コード長 2,311 bytes
コンパイル時間 2,610 ms
コンパイル使用メモリ 152,724 KB
実行使用メモリ 8,556 KB
最終ジャッジ日時 2023-09-22 11:44:38
合計ジャッジ時間 5,681 ms
ジャッジサーバーID
(参考情報)
judge12 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
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,376 KB
testcase_04 AC 1 ms
4,380 KB
testcase_05 AC 1 ms
4,376 KB
testcase_06 AC 1 ms
4,384 KB
testcase_07 AC 1 ms
4,380 KB
testcase_08 AC 1 ms
4,376 KB
testcase_09 AC 1 ms
4,380 KB
testcase_10 AC 1 ms
4,380 KB
testcase_11 AC 1 ms
4,376 KB
testcase_12 AC 1 ms
4,376 KB
testcase_13 AC 1 ms
4,376 KB
testcase_14 AC 1 ms
4,376 KB
testcase_15 AC 120 ms
7,448 KB
testcase_16 AC 46 ms
8,556 KB
testcase_17 AC 189 ms
8,504 KB
testcase_18 AC 163 ms
8,548 KB
testcase_19 AC 70 ms
5,560 KB
testcase_20 AC 40 ms
5,436 KB
testcase_21 AC 149 ms
7,976 KB
testcase_22 AC 39 ms
5,140 KB
testcase_23 AC 185 ms
5,796 KB
testcase_24 AC 49 ms
5,260 KB
testcase_25 AC 65 ms
4,560 KB
testcase_26 AC 91 ms
6,316 KB
testcase_27 AC 55 ms
7,376 KB
testcase_28 AC 1 ms
4,376 KB
testcase_29 AC 2 ms
4,376 KB
testcase_30 AC 1 ms
4,376 KB
testcase_31 AC 2 ms
4,380 KB
testcase_32 AC 1 ms
4,380 KB
testcase_33 AC 1 ms
4,380 KB
testcase_34 AC 2 ms
4,380 KB
testcase_35 AC 2 ms
4,380 KB
testcase_36 AC 1 ms
4,376 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));
    }
    for p in g.iter_mut() {
        p.sort_by_key(|e| e.1);
    }

    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