Submission #2176519


Source Code Expand

use std::str::FromStr;
use std::io::*;

pub fn main() {
    let i = stdin();
    let mut o = Vec::new();
    run(&mut i.lock(), &mut o);
    stdout().write_all(&o).unwrap();
}

fn run<R: BufRead, W: Write>(i: &mut R, o: &mut W) {
    let mut i = AtRead::from(i);
    let (n, g, e) = i.read3::<usize, usize, usize>();
    let p = i.read_vec(g);
    let mut links = Vec::new();
    for _ in 0..e {
        links.push(i.read2());
    }
    let mut sns = Sns::new(n, p, links);
    writeln!(o, "{}", solve(&mut sns)).unwrap();
}
fn solve(sns: &mut Sns) -> usize {
    sns.prepare();

    let mut result = 0;
    while sns.visit() {
        // TODO
        result += 1;
    }

    result
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
enum Flow {
    Up,   // インデックスが増える方向
    Down, // インデックスが減る方向
    None,
}

#[derive(Debug, Clone)]
struct Sns {
    n: usize,                         // ユーザー数
    links: Vec<(usize, usize)>,       // フレンドリンク
    targets: Vec<usize>,              // ターゲットのリスト
    linkids: Vec<Vec<Option<usize>>>, // linkids[a][b] はa,b間のフレンドのリンクのインデックス
    visits: Vec<Option<usize>>,       // visits[n]はユーザーID n のフレンド探索元
    flows: Vec<Flow>,                 // リンクの使用状況
    q: Vec<usize>,                    // self.v 計算用バッファ
}

impl Sns {
    fn new(n: usize, targets: Vec<usize>, links: Vec<(usize, usize)>) -> Self {
        let n = n + 1;
        let links_len = links.len();
        Sns {
            n: n,
            links: links,
            targets: targets,
            linkids: vec![vec![None; n]; n],
            visits: vec![None; n],
            flows: vec![Flow::None; links_len],
            q: Vec::new(),
        }
    }
    fn prepare_linkids(&mut self) {
        for i0 in 0..self.n {
            for i1 in 0..self.n {
                self.linkids[i0][i1] = None;
            }
        }
        for i in 0..self.links.len() {
            let link = self.links[i];
            self.linkids[link.0][link.1] = Some(i);
            self.linkids[link.1][link.0] = Some(i);
        }
    }
    fn visit(&mut self) -> bool {
        let n = self.n;
        self.visits.clear();
        self.visits.resize(n, None);

        self.q.clear();
        self.q.push(0);
        self.visits[0] = Some(0);
        while let Some(i0) = self.q.pop() {
            for i1 in 1..n {
                if self.try_move(i0, i1) {
                    if i1 == n - 1 {
                        self.apply_flow();
                        return true;
                    }
                    self.q.push(i1);
                }
            }
        }
        false
    }
    fn apply_flow(&mut self) {
        let mut to = self.n - 1;
        while to != 0 {
            let from = self.visits[to].unwrap();
            let l = self.linkids[from][to].unwrap();
            let flow = self.flows[l];
            self.flows[l] = if from < to {
                match flow {
                    Flow::Down => Flow::None,
                    Flow::None => Flow::Up,
                    _ => unreachable!(),
                }
            } else {
                match flow {
                    Flow::Up => Flow::None,
                    Flow::None => Flow::Down,
                    _ => unreachable!(),
                }
            };
            to = from;
        }
    }
    fn try_move(&mut self, from: usize, to: usize) -> bool {
        if self.visits[to].is_some() {
            return false;
        }
        if let Some(i) = self.linkids[from][to] {
            let flow = self.flows[i];
            if flow == Flow::Up && from < to {
                return false;
            }
            if flow == Flow::Down && from > to {
                return false;
            }
            self.visits[to] = Some(from);
            true
        } else {
            false
        }
    }
    fn prepare(&mut self) {
        self.prepare_linkids();
        self.visit();

        self.links = self.links
            .iter()
            .cloned()
            .filter(|i| self.visits[i.0].is_some())
            .collect();
        self.targets = self.targets
            .iter()
            .cloned()
            .filter(|&i| self.visits[i].is_some())
            .collect();

        let goal = self.n - 1;
        for &t in self.targets.iter() {
            self.links.push((t, goal));
        }
        self.prepare_linkids();
        self.flows.resize(self.links.len(), Flow::None);
    }
}

struct AtRead<'a, R: BufRead + 'a> {
    r: &'a mut R,
    s: String,
}

macro_rules! fn_read {
        {$f:ident($($v:ident: $t:ident),*)} => {
            fn $f<$($t: FromStr),*>(&mut self) -> ($($t),*) {
                let i = &mut self.next().split(' ');
                $(
                    let $v = next(i);
                )*
                ($($v),*)
            }
        };
    }

impl<'a, R: BufRead + 'a> AtRead<'a, R> {
    fn from(r: &'a mut R) -> Self {
        AtRead {
            r: r,
            s: String::new(),
        }
    }
    fn next(&mut self) -> &str {
        self.s.clear();
        self.r.read_line(&mut self.s).unwrap();
        self.s.trim()
    }

    fn_read! { read2(v1: T1, v2: T2) }
    fn_read! { read3(v1: T1, v2: T2, v3: T3) }

    fn read_vec<T: FromStr>(&mut self, n: usize) -> Vec<T> {
        self.next()
            .split(' ')
            .take(n)
            .map(|x| x.parse().ok().unwrap())
            .collect()
    }
}

fn next<'a, T: FromStr, I: std::iter::Iterator<Item = &'a str>>(i: &mut I) -> T {
    i.next().unwrap().parse().ok().unwrap()
}

Submission Info

Submission Time
Task D - 浮気予防
User frozenlib
Language Rust (1.15.1)
Score 100
Code Size 5900 Byte
Status AC
Exec Time 3 ms
Memory 4352 KB

Judge Result

Set Name part All
Score / Max Score 99 / 99 1 / 1
Status
AC × 27
AC × 61
Set Name Test Cases
part test_01_AB.txt, test_02_AB.txt, test_03_AB.txt, test_04_AB.txt, test_05_AB.txt, test_06_AB.txt, test_07_AB.txt, test_08_AB.txt, test_09_AB.txt, test_10_AB.txt, test_11_AB.txt, test_12_AB.txt, test_13_AB.txt, test_14_AB.txt, test_15_AB.txt, test_16_AB.txt, test_17_AB.txt, test_18_AB.txt, test_19_AB.txt, test_20_AB.txt, test_21_AB.txt, test_22_AB.txt, test_23_AB.txt, test_24_AB.txt, test_25_AB.txt, test_41_AB.txt, test_47_AB.txt
All sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, sample_05.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, sample_05.txt, test_01_AB.txt, test_02_AB.txt, test_03_AB.txt, test_04_AB.txt, test_05_AB.txt, test_06_AB.txt, test_07_AB.txt, test_08_AB.txt, test_09_AB.txt, test_10_AB.txt, test_11_AB.txt, test_12_AB.txt, test_13_AB.txt, test_14_AB.txt, test_15_AB.txt, test_16_AB.txt, test_17_AB.txt, test_18_AB.txt, test_19_AB.txt, test_20_AB.txt, test_21_AB.txt, test_22_AB.txt, test_23_AB.txt, test_24_AB.txt, test_25_AB.txt, test_26_A.txt, test_27_A.txt, test_28_A.txt, test_29_A.txt, test_30_A.txt, test_31_A.txt, test_32_A.txt, test_33_A.txt, test_34_A.txt, test_35_A.txt, test_36_A.txt, test_37_A.txt, test_38_A.txt, test_39_A.txt, test_40_A.txt, test_41_AB.txt, test_42_A.txt, test_43_A.txt, test_44_A.txt, test_45_A.txt, test_46_A.txt, test_47_AB.txt, test_48_A.txt, test_49_A.txt, test_50_A.txt, test_51_A.txt
Case Name Status Exec Time Memory
sample_01.txt AC 2 ms 4352 KB
sample_02.txt AC 2 ms 4352 KB
sample_03.txt AC 2 ms 4352 KB
sample_04.txt AC 2 ms 4352 KB
sample_05.txt AC 2 ms 4352 KB
test_01_AB.txt AC 2 ms 4352 KB
test_02_AB.txt AC 2 ms 4352 KB
test_03_AB.txt AC 2 ms 4352 KB
test_04_AB.txt AC 2 ms 4352 KB
test_05_AB.txt AC 2 ms 4352 KB
test_06_AB.txt AC 2 ms 4352 KB
test_07_AB.txt AC 2 ms 4352 KB
test_08_AB.txt AC 2 ms 4352 KB
test_09_AB.txt AC 2 ms 4352 KB
test_10_AB.txt AC 2 ms 4352 KB
test_11_AB.txt AC 2 ms 4352 KB
test_12_AB.txt AC 2 ms 4352 KB
test_13_AB.txt AC 2 ms 4352 KB
test_14_AB.txt AC 2 ms 4352 KB
test_15_AB.txt AC 2 ms 4352 KB
test_16_AB.txt AC 2 ms 4352 KB
test_17_AB.txt AC 2 ms 4352 KB
test_18_AB.txt AC 2 ms 4352 KB
test_19_AB.txt AC 2 ms 4352 KB
test_20_AB.txt AC 2 ms 4352 KB
test_21_AB.txt AC 2 ms 4352 KB
test_22_AB.txt AC 2 ms 4352 KB
test_23_AB.txt AC 2 ms 4352 KB
test_24_AB.txt AC 2 ms 4352 KB
test_25_AB.txt AC 2 ms 4352 KB
test_26_A.txt AC 2 ms 4352 KB
test_27_A.txt AC 3 ms 4352 KB
test_28_A.txt AC 3 ms 4352 KB
test_29_A.txt AC 3 ms 4352 KB
test_30_A.txt AC 2 ms 4352 KB
test_31_A.txt AC 3 ms 4352 KB
test_32_A.txt AC 2 ms 4352 KB
test_33_A.txt AC 2 ms 4352 KB
test_34_A.txt AC 2 ms 4352 KB
test_35_A.txt AC 2 ms 4352 KB
test_36_A.txt AC 2 ms 4352 KB
test_37_A.txt AC 2 ms 4352 KB
test_38_A.txt AC 2 ms 4352 KB
test_39_A.txt AC 2 ms 4352 KB
test_40_A.txt AC 2 ms 4352 KB
test_41_AB.txt AC 2 ms 4352 KB
test_42_A.txt AC 2 ms 4352 KB
test_43_A.txt AC 2 ms 4352 KB
test_44_A.txt AC 2 ms 4352 KB
test_45_A.txt AC 2 ms 4352 KB
test_46_A.txt AC 2 ms 4352 KB
test_47_AB.txt AC 2 ms 4352 KB
test_48_A.txt AC 2 ms 4352 KB
test_49_A.txt AC 2 ms 4352 KB
test_50_A.txt AC 2 ms 4352 KB
test_51_A.txt AC 2 ms 4352 KB