Submission #2376374


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);
                if next_cost == v_cost {
                    q.push_front((to, next_cost, next_company));
                } else {
                    q.push_back((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 3474 Byte
Status TLE
Exec Time 3156 ms
Memory 45748 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 × 55
TLE × 4
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 AC 2 ms 4352 KB
02.txt AC 76 ms 18624 KB
03.txt AC 252 ms 43256 KB
04.txt AC 126 ms 39160 KB
05.txt AC 201 ms 41136 KB
06.txt AC 137 ms 26852 KB
07.txt AC 113 ms 24948 KB
08.txt AC 193 ms 43236 KB
09.txt AC 100 ms 24804 KB
10.txt AC 157 ms 28900 KB
11.txt AC 128 ms 37108 KB
12.txt AC 48 ms 16636 KB
13.txt AC 81 ms 24004 KB
14.txt AC 101 ms 30972 KB
15.txt AC 118 ms 26976 KB
16.txt AC 149 ms 35076 KB
17.txt AC 137 ms 38712 KB
18.txt AC 63 ms 18684 KB
19.txt AC 91 ms 34780 KB
20.txt AC 120 ms 37032 KB
21.txt AC 108 ms 40972 KB
22.txt AC 725 ms 38780 KB
23.txt AC 230 ms 45748 KB
24.txt AC 98 ms 28928 KB
25.txt AC 52 ms 18684 KB
26.txt AC 68 ms 20704 KB
27.txt AC 77 ms 26876 KB
28.txt AC 117 ms 33016 KB
29.txt AC 137 ms 32952 KB
30.txt AC 84 ms 30436 KB
31.txt AC 112 ms 26068 KB
32.txt AC 148 ms 34852 KB
33.txt AC 89 ms 28848 KB
34.txt AC 321 ms 28924 KB
35.txt AC 55 ms 16636 KB
36.txt AC 191 ms 16636 KB
37.txt AC 144 ms 26876 KB
38.txt AC 208 ms 28992 KB
sample_01.txt AC 2 ms 4352 KB
sample_02.txt AC 2 ms 4352 KB
sample_03.txt AC 2 ms 4352 KB
w1.txt AC 108 ms 34992 KB
w10.txt AC 225 ms 35032 KB
w11.txt AC 56 ms 18752 KB
w12.txt AC 69 ms 16636 KB
w13.txt AC 1341 ms 24744 KB
w14.txt AC 364 ms 39136 KB
w15.txt AC 55 ms 18200 KB
w16.txt AC 65 ms 14588 KB
w17.txt AC 69 ms 12540 KB
w18.txt AC 161 ms 22780 KB
w2.txt AC 206 ms 36108 KB
w3.txt AC 232 ms 35036 KB
w4.txt AC 97 ms 24824 KB
w5.txt TLE 3156 ms 41204 KB
w6.txt AC 140 ms 41164 KB
w7.txt TLE 3156 ms 36648 KB
w8.txt TLE 3156 ms 38404 KB
w9.txt TLE 3156 ms 39144 KB