2
use std::collections::BinaryHeap;4
pub fn to_graph(edges: &Vec<(usize, usize)>, scores: &Vec<u32>) -> Vec<Vec<usize>> {5
const HEAP_THRESHOLD: usize = 3;9
let mut ret = vec![BinaryHeap::new(); n];11
for &(v0, v1) in edges {15
ret[v0].push(Reverse((e1, v1)));16
ret[v1].push(Reverse((e0, v0)));18
if ret[v0].len() > HEAP_THRESHOLD {21
if ret[v1].len() > HEAP_THRESHOLD {28
.map(|heap| heap.into_iter().map(|e| e.0 .1).collect::<Vec<_>>())33
pub fn maximum_score(scores: Vec<i32>, edges: Vec<Vec<i32>>) -> i32 {34
let scores = scores.into_iter().map(|e| e as u32).collect::<Vec<_>>();37
.filter(|v| v.len() == 2)38
.map(|v| v.into_iter().map(|e| e as usize).collect::<Vec<_>>())39
.map(|v| (v[0], v[1]))40
.filter(|(v0, v1)| v0 != v1)42
let graph = to_graph(&edges, &scores);45
for (v0, v1) in edges {47
for v0_next in graph[v0].clone() {51
let e0_next = scores[v0_next];52
for v1_next in graph[v1].clone() {56
if v0_next == v1_next {59
let e1_next = scores[v1_next];60
_ret = Some(_ret.unwrap_or(u32::MIN).max(e0_next + e1_next));63
let mut _ret = if let Some(inner) = _ret {71
ret = Some(ret.unwrap_or(u32::MIN).max(_ret));74
ret.map(|e| e as i32).unwrap_or(-1)