Submission #49867565


Source Code Expand

use std::{
    cmp::Reverse,
    collections::{BinaryHeap, HashSet},
};

use proconio::{input, marker::Usize1};

fn main() {
    input! {
        n: usize,
        m: usize,
        st: [(Usize1, Usize1); m]
    };

    let mut edges = vec![vec![]; n];
    for (i, (s, t)) in st.into_iter().enumerate() {
        edges[s].push((t, i));
    }

    let inf = 1_usize << 60;
    let mut dist = vec![(inf, n, n); n];
    dist[0] = (0_usize, 0_usize, m);
    let mut pq = BinaryHeap::new();
    pq.push((Reverse(0), 0));
    while let Some((Reverse(d), u)) = pq.pop() {
        if d > dist[u].0 {
            continue;
        }
        for (v, i) in edges[u].iter().copied() {
            let next = (dist[u].0 + 1, u, i);
            if next.0 < dist[v].0 {
                dist[v] = next;
                pq.push((Reverse(next.0), v));
            }
        }
    }

    if dist[n - 1].0 == inf {
        for _ in 0..m {
            println!("-1");
        }
        return;
    }

    let mut set = HashSet::new();
    let mut cur = n - 1;
    while dist[cur].1 != cur {
        set.insert(dist[cur].2);
        cur = dist[cur].1;
    }

    for i in 0..m {
        if set.contains(&i) {
            let mut dist2 = vec![inf; n];
            dist2[0] = 0_usize;
            let mut pq = BinaryHeap::new();
            pq.push((Reverse(0), 0));
            while let Some((Reverse(d), u)) = pq.pop() {
                if d > dist2[u] {
                    continue;
                }
                for (v, j) in edges[u].iter().copied() {
                    if i == j {
                        continue;
                    }
                    let next = (d + 1, v);
                    if next.0 < dist2[v] {
                        dist2[v] = next.0;
                        pq.push((Reverse(next.0), next.1));
                    }
                }
            }

            if dist2[n - 1] == inf {
                println!("-1");
            } else {
                println!("{}", dist2[n - 1]);
            }
        } else {
            println!("{}", dist[n - 1].0);
        }
    }
}

Submission Info

Submission Time
Task F - Blocked Roads
User bouzuya
Language Rust (rustc 1.70.0)
Score 500
Code Size 2099 Byte
Status AC
Exec Time 147 ms
Memory 8600 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 4
AC × 32
Set Name Test Cases
Sample sample_00.txt, sample_01.txt, sample_02.txt, sample_03.txt
All case_00.txt, case_01.txt, case_02.txt, case_03.txt, case_04.txt, case_05.txt, case_06.txt, case_07.txt, case_08.txt, case_09.txt, case_10.txt, case_11.txt, case_12.txt, case_13.txt, case_14.txt, case_15.txt, case_16.txt, case_17.txt, case_18.txt, case_19.txt, case_20.txt, case_21.txt, case_22.txt, case_23.txt, case_24.txt, case_25.txt, case_26.txt, case_27.txt, sample_00.txt, sample_01.txt, sample_02.txt, sample_03.txt
Case Name Status Exec Time Memory
case_00.txt AC 88 ms 5568 KiB
case_01.txt AC 89 ms 5616 KiB
case_02.txt AC 89 ms 5688 KiB
case_03.txt AC 89 ms 5636 KiB
case_04.txt AC 89 ms 5656 KiB
case_05.txt AC 89 ms 5692 KiB
case_06.txt AC 89 ms 5672 KiB
case_07.txt AC 89 ms 5680 KiB
case_08.txt AC 89 ms 5532 KiB
case_09.txt AC 89 ms 5524 KiB
case_10.txt AC 89 ms 5520 KiB
case_11.txt AC 89 ms 5520 KiB
case_12.txt AC 89 ms 5512 KiB
case_13.txt AC 89 ms 5556 KiB
case_14.txt AC 89 ms 5608 KiB
case_15.txt AC 86 ms 5404 KiB
case_16.txt AC 147 ms 8600 KiB
case_17.txt AC 70 ms 5204 KiB
case_18.txt AC 2 ms 1980 KiB
case_19.txt AC 9 ms 2300 KiB
case_20.txt AC 30 ms 3344 KiB
case_21.txt AC 5 ms 2132 KiB
case_22.txt AC 1 ms 1972 KiB
case_23.txt AC 3 ms 2152 KiB
case_24.txt AC 8 ms 2456 KiB
case_25.txt AC 28 ms 3312 KiB
case_26.txt AC 14 ms 2224 KiB
case_27.txt AC 15 ms 2504 KiB
sample_00.txt AC 1 ms 1876 KiB
sample_01.txt AC 1 ms 1848 KiB
sample_02.txt AC 1 ms 1884 KiB
sample_03.txt AC 1 ms 1876 KiB