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 |
|
|
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 |