Submission #2376356


Source Code Expand

use std::collections::BTreeMap;
use std::collections::BTreeSet;
use std::collections::HashMap;
use std::collections::VecDeque;

fn main() {
    let mut sc = Scanner::new();
    let n: usize = sc.read();
    let m: usize = sc.read();
    let mut graph = vec![vec![]; n];
    let mut dist = HashMap::new();
    for _ in 0..m {
        let p = sc.read::<usize>() - 1;
        let q = sc.read::<usize>() - 1;
        let c: u32 = sc.read();
        graph[p].push((q, c));
        graph[q].push((p, c));
        dist.insert((p, c), std::usize::MAX);
        dist.insert((q, c), std::usize::MAX);
    }

    let mut q = VecDeque::new();
    for &(to, company) in &graph[0] {
        q.push_back((to, 1, company));
        dist.insert((to, company), 1);
        dist.insert((0, company), 0);
    }

    let mut visit = BTreeSet::new();
    while !q.is_empty() {
        let (v, v_cost, company) = q.pop_front().unwrap();
        if v == n - 1 {
            println!("{}", v_cost);
            return;
        }
        if visit.contains(&(v, company)) {
            continue;
        }
        visit.insert((v, company));

        for &(to, next_company) in &graph[v] {
            let next_cost = if company == next_company {
                v_cost
            } else {
                v_cost + 1
            };

            let cost = *dist.get(&(to, next_company)).unwrap();
            if cost > next_cost {
                dist.insert((to, next_company), next_cost);
                q.push_front((to, next_cost, next_company));
            }
        }
    }

    println!("-1");
}

struct Scanner {
    ptr: usize,
    length: usize,
    buf: Vec<u8>,
    small_cache: Vec<u8>,
}

impl Scanner {
    fn new() -> Scanner {
        Scanner {
            ptr: 0,
            length: 0,
            buf: vec![0; 1024],
            small_cache: vec![0; 1024],
        }
    }

    fn load(&mut self) {
        use std::io::Read;
        let mut s = std::io::stdin();
        self.length = s.read(&mut self.buf).unwrap();
    }

    fn byte(&mut self) -> u8 {
        if self.ptr >= self.length {
            self.ptr = 0;
            self.load();
            if self.length == 0 {
                self.buf[0] = b'\n';
                self.length = 1;
            }
        }

        self.ptr += 1;
        return self.buf[self.ptr - 1];
    }

    fn is_space(b: u8) -> bool {
        b == b'\n' || b == b'\r' || b == b'\t' || b == b' '
    }

    fn read<T>(&mut self) -> T
    where
        T: std::str::FromStr,
        T::Err: std::fmt::Debug,
    {
        let mut b = self.byte();
        while Scanner::is_space(b) {
            b = self.byte();
        }

        for pos in 0..self.small_cache.len() {
            self.small_cache[pos] = b;
            b = self.byte();
            if Scanner::is_space(b) {
                return String::from_utf8_lossy(&self.small_cache[0..(pos + 1)])
                    .parse()
                    .unwrap();
            }
        }

        let mut v = self.small_cache.clone();
        while !Scanner::is_space(b) {
            v.push(b);
            b = self.byte();
        }
        return String::from_utf8_lossy(&v).parse().unwrap();
    }
}

Submission Info

Submission Time
Task E - Snuke's Subway Trip
User kenkoooo
Language Rust (1.15.1)
Score 0
Code Size 3318 Byte
Status WA
Exec Time 3156 ms
Memory 47836 KB

Compile Error

warning: unused import: `std::collections::BTreeMap`, #[warn(unused_imports)] on by default
 --> ./Main.rs:1:5
  |
1 | use std::collections::BTreeMap;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 600
Status AC
AC × 17
WA × 40
TLE × 2
Set Name Test Cases
Sample
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, 37.txt, 38.txt, sample_01.txt, sample_02.txt, sample_03.txt, w1.txt, w10.txt, w11.txt, w12.txt, w13.txt, w14.txt, w15.txt, w16.txt, w17.txt, w18.txt, w2.txt, w3.txt, w4.txt, w5.txt, w6.txt, w7.txt, w8.txt, w9.txt
Case Name Status Exec Time Memory
01.txt WA 2 ms 4352 KB
02.txt WA 107 ms 22520 KB
03.txt WA 169 ms 41208 KB
04.txt AC 126 ms 39160 KB
05.txt WA 176 ms 41136 KB
06.txt AC 103 ms 30948 KB
07.txt WA 134 ms 28916 KB
08.txt WA 137 ms 39140 KB
09.txt WA 72 ms 24804 KB
10.txt WA 125 ms 26852 KB
11.txt WA 172 ms 37108 KB
12.txt AC 48 ms 16636 KB
13.txt WA 76 ms 24004 KB
14.txt WA 113 ms 35068 KB
15.txt AC 137 ms 26848 KB
16.txt WA 123 ms 33028 KB
17.txt WA 125 ms 38712 KB
18.txt AC 66 ms 18684 KB
19.txt AC 92 ms 34780 KB
20.txt WA 293 ms 37032 KB
21.txt TLE 3156 ms 45228 KB
22.txt WA 1776 ms 38780 KB
23.txt WA 268 ms 43224 KB
24.txt WA 91 ms 33024 KB
25.txt WA 51 ms 18684 KB
26.txt AC 70 ms 20704 KB
27.txt WA 100 ms 30972 KB
28.txt WA 93 ms 33016 KB
29.txt WA 188 ms 37048 KB
30.txt WA 137 ms 34784 KB
31.txt WA 71 ms 20700 KB
32.txt AC 100 ms 34724 KB
33.txt WA 115 ms 32944 KB
34.txt WA 931 ms 28924 KB
35.txt AC 53 ms 16636 KB
36.txt AC 190 ms 16636 KB
37.txt WA 659 ms 26876 KB
38.txt WA 656 ms 28864 KB
sample_01.txt AC 2 ms 4352 KB
sample_02.txt WA 2 ms 4352 KB
sample_03.txt AC 2 ms 4352 KB
w1.txt AC 123 ms 34992 KB
w10.txt AC 231 ms 39128 KB
w11.txt WA 56 ms 18752 KB
w12.txt WA 68 ms 16636 KB
w13.txt WA 122 ms 30888 KB
w14.txt AC 388 ms 45264 KB
w15.txt WA 55 ms 18200 KB
w16.txt WA 63 ms 14588 KB
w17.txt WA 68 ms 12540 KB
w18.txt WA 104 ms 22780 KB
w2.txt WA 142 ms 34956 KB
w3.txt WA 113 ms 30940 KB
w4.txt AC 85 ms 24824 KB
w5.txt TLE 3156 ms 41204 KB
w6.txt AC 324 ms 45244 KB
w7.txt WA 155 ms 47836 KB
w8.txt WA 174 ms 43736 KB
w9.txt WA 172 ms 43240 KB