Submission #2376321


Source Code Expand

use std::collections::BTreeMap;
use std::collections::BTreeSet;
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];
    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));
    }

    let mut dist = BTreeMap::new();
    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
            };
            match dist.get(&(to, next_company)) {
                Some(&cost) => if cost > next_cost {
                    assert_eq!(next_cost, v_cost);
                    dist.insert((to, next_company), next_cost);
                    q.push_front((to, next_cost, next_company));
                },
                _ => {
                    dist.insert((to, next_company), next_cost);
                    if next_cost > v_cost {
                        q.push_back((to, next_cost, next_company));
                    } else {
                        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 3621 Byte
Status TLE
Exec Time 3156 ms
Memory 35068 KB

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 49 ms 14588 KB
03.txt AC 271 ms 35068 KB
04.txt AC 51 ms 18684 KB
05.txt AC 204 ms 30972 KB
06.txt AC 154 ms 26876 KB
07.txt AC 118 ms 20732 KB
08.txt AC 158 ms 28924 KB
09.txt AC 97 ms 20732 KB
10.txt AC 198 ms 26876 KB
11.txt AC 142 ms 28924 KB
12.txt AC 30 ms 16636 KB
13.txt AC 77 ms 18684 KB
14.txt AC 109 ms 24828 KB
15.txt AC 108 ms 26876 KB
16.txt AC 163 ms 28924 KB
17.txt AC 162 ms 30972 KB
18.txt AC 49 ms 16636 KB
19.txt AC 83 ms 26876 KB
20.txt AC 137 ms 30972 KB
21.txt AC 51 ms 20732 KB
22.txt AC 1731 ms 33020 KB
23.txt AC 338 ms 33020 KB
24.txt AC 75 ms 22780 KB
25.txt AC 35 ms 16636 KB
26.txt AC 43 ms 16636 KB
27.txt AC 43 ms 16636 KB
28.txt AC 113 ms 26876 KB
29.txt AC 137 ms 28924 KB
30.txt AC 46 ms 22780 KB
31.txt AC 133 ms 18684 KB
32.txt AC 153 ms 28924 KB
33.txt AC 67 ms 22780 KB
34.txt AC 704 ms 22780 KB
35.txt AC 36 ms 16636 KB
36.txt AC 325 ms 16636 KB
37.txt AC 221 ms 22780 KB
38.txt AC 392 ms 24828 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 113 ms 24828 KB
w10.txt AC 224 ms 20732 KB
w11.txt AC 52 ms 18264 KB
w12.txt AC 63 ms 16636 KB
w13.txt AC 2569 ms 22780 KB
w14.txt AC 512 ms 30972 KB
w15.txt AC 38 ms 18200 KB
w16.txt AC 45 ms 14588 KB
w17.txt AC 58 ms 12540 KB
w18.txt AC 203 ms 18684 KB
w2.txt AC 257 ms 28840 KB
w3.txt AC 263 ms 33020 KB
w4.txt AC 67 ms 20732 KB
w5.txt TLE 3155 ms 24828 KB
w6.txt AC 116 ms 26876 KB
w7.txt TLE 3156 ms 19728 KB
w8.txt TLE 3155 ms 14588 KB
w9.txt TLE 3155 ms 24828 KB