// codesnip-guard: minimum_assignment #[cfg_attr(any(),rustfmt::skip)]pub use self::assignment::minimum_assignment;#[cfg_attr(any(),rustfmt::skip)]mod assignment{#[doc=" Returns the minimum cost and a column assigned to each row of a square cost matrix."]pub fn minimum_assignment(cost:&[Vec])->(i64,Vec)where T:Copy+Into{let n=cost.len();assert!(cost.iter().all(|row|row.len()==n));if n==0{return(0,Vec::new());}let value=|row:usize,column:usize|cost[row][column].into();let mut monge=true;let mut anti_monge=true;'outer:for row in 0..n-1{for column in 0..n-1{let straight=i128::from(value(row,column))+i128::from(value(row+1,column+1));let crossed=i128::from(value(row,column+1))+i128::from(value(row+1,column));monge&=straight<=crossed;anti_monge&=straight>=crossed;if!monge&&!anti_monge{break 'outer;}}}if monge||anti_monge{let assignment:Vec<_>=if monge{(0..n).collect()}else{(0..n).rev().collect()};let total=(0..n).map(|row|value(row,assignment[row])).sum();return(total,assignment);}let none=!0;let mut row_mate=vec![none;n];let mut column_mate=vec![none;n];let mut potential=vec![0;n];let mut transferable=vec![false;n];for column in 0..n{let mut row=0;for next in 1..n{if value(next,column)=(0..n).collect();let mut distance=vec![0;n];let mut predecessor=vec![0;n];for start in 0..n{if row_mate[start]!=none{continue;}for column in 0..n{distance[column]=value(start,column)-potential[column];predecessor[column]=start;}let mut scanned=0;let mut labeled=0;let mut last=0;let free_column=loop{if scanned==labeled{last=scanned;let mut best=distance[columns[scanned]];for next in scanned..n{let column=columns[next];if distance[column]<=best{if distance[column]